Android и MySQL

Alt
Сообщения: 6
Зарегистрирован: 07 ноя 2013, 12:56

Re: Android и MySQL

Сообщение Alt » 07 ноя 2013, 13:17

Foenix писал(а):при подключении к ms sql нужен другой драйвер. Сто раз тут обсуждалось.
Да, да, я уточняю что у меня проблема именно в этом :) не ругайтесь))

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Android и MySQL

Сообщение Isaev » 07 ноя 2013, 13:31

Alt, эту тему с самого начала и тут ещё почитай
viewtopic.php?f=41&t=1876

Alt
Сообщения: 6
Зарегистрирован: 07 ноя 2013, 12:56

Re: Android и MySQL

Сообщение Alt » 07 ноя 2013, 14:03

Да спасибо, читал) я понял что изначально у вас недопонимание сложилось ты подключался к майскл через jtds, а тебе советы давали касаемо другого драйвера. когда же ты другой драйвер взял все получилось(исключим ошибку локалхоста, и подключения драйверов) это я уже поборол). у меня просто когда я подключался с драйвером мускл к мсскл выходила ошибка сокетов, то есть конект идет но сервак не пускает. я сейчас пробую jtdc подсключить и спомощью него подключиться.

Alt
Сообщения: 6
Зарегистрирован: 07 ноя 2013, 12:56

Re: Android и MySQL

Сообщение Alt » 07 ноя 2013, 14:08

чтобы предметно говорить код выложу

[syntax=java]package com.samples.app.dbcontact;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class DbCreateActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final Button bCreate = (Button) findViewById(R.id.button);

bCreate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

Toast.makeText(getApplicationContext(),
"MySQL Connect Example.", Toast.LENGTH_SHORT).show();

Connection conn = null;
/* String url = "jdbc:mysql://10.16.16.34:1406/base_name";
String driver = "com.mysql.jdbc.Driver";
String userName = "login";
String password = "qwerty"; */

String url = "jdbc:jtds:sqlserver://10.16.16.34:1406/base_name";
String driver = "net.sourceforge.jtds.jdbc.Driver";
String userName = "login";
String password = "qwerty";

try {

Toast.makeText(getApplicationContext(), "sozdaem driver",
Toast.LENGTH_SHORT).show();
Class.forName(driver).newInstance();
Toast.makeText(getApplicationContext(), "podkluchaemsya",
Toast.LENGTH_SHORT).show();
conn = DriverManager.getConnection(url, userName, password);
Toast.makeText(getApplicationContext(),
"Connected to the database", Toast.LENGTH_SHORT)
.show();

conn.close();
Toast.makeText(getApplicationContext(),
"Disconnected from database", Toast.LENGTH_SHORT)
.show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "ne rabotaet",
Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(),
"Msg: " + e.getMessage(), Toast.LENGTH_SHORT)
.show();
}
}

});
}
}[/syntax]

Конект с еклипса на базу MSSQL server находящуюся в сети. использую эмулятор

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Android и MySQL

Сообщение Foenix » 07 ноя 2013, 14:23

обсуждается все в куче, т.к. кроме драйвера различий нету никаких
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Android и MySQL

Сообщение Isaev » 07 ноя 2013, 14:26

Alt, сложилось мнение, что если не в отдельном потоке подключаться - работает не корректно, а в большинстве случаев и вовсе не работает
уж не знаю почему, но на практике тоже помогает, хотя прямой зависимости я не вижу)

Alt
Сообщения: 6
Зарегистрирован: 07 ноя 2013, 12:56

Re: Android и MySQL

Сообщение Alt » 07 ноя 2013, 16:51

Вообщем взял за основу код Исаева, но использовал другой драйвер для подключения (jtds-1.3.1), подключал драйвер непосредственно в проект как внешнюю JAR, на вкладке библиотеки включил. но либо всеже класс должен быть другой, либо сам драйвер не подключился)))

[syntax=java] try {
Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
log.info(">>> jdbc.Driver: instance successful");
} catch (Exception e) {
log.info(">>> jdbc.Driver: instance error");
e.printStackTrace();
}
[/syntax]

C драйвером разобрался, увиделся)
11-07 14:13:38.832: I/MainActivity(655): >>> jdbc.Driver: instance successful
а вот дальше ...
11-07 14:13:38.832: I/MainActivity(655): >>> jdbc.Driver: connect error
11-07 14:13:38.843: I/System.out(655): >SQLException: No suitable driver

Хм. заметил еще особенность с с драйвером выложенным в ветке(jtds-1.2.6-dist) инстансе сакцес, а скаченой новой версией(jtds-1.3.1) еррор ))

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Android и MySQL

Сообщение Foenix » 07 ноя 2013, 19:39

да, в зависимости от версии могут быть ошибки.. КОннект - ищите несоответствие уже далее - пароль, сервер не слушает tcp ip или еще что-нибудь такое.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Android и MySQL

Сообщение Isaev » 08 ноя 2013, 10:14

Alt, у меня та версия тоже так и не заработала
в конце концов взял mysql-connector-java-5.1.26-bin.jar
подключение:

Код: Выделить всё

      Thread t = new Thread(new Runnable() {
        public void run() {
          Log.d(LOG_TAG,">>> Thread is created");

          Connection conn = null;

          String sServerName = "10.0.2.2:3306";
          String sDBName = "name";

          Properties properties = new Properties();
          properties.setProperty("user", "root");
          properties.setProperty("password", "");
          properties.setProperty("useUnicode", "true");
          properties.setProperty("characterEncoding", "UTF-8");
          properties.setProperty("autoReconnect", "true");

          try {
            Class.forName("com.mysql.jdbc.Driver");
            Log.d(LOG_TAG,">>> jdbc.Driver: instance successful");
          } catch (Exception e) {
            Log.d(LOG_TAG,">>> jdbc.Driver: instance error");
            e.printStackTrace();
          }

          try {
            conn=DriverManager.getConnection("jdbc:mysql://"+sServerName+"/"+sDBName,properties);
            //if(conn!=null) {
            Log.d(LOG_TAG,">>> jdbc.Driver: connect successful");
          }

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Android и MySQL

Сообщение Isaev » 08 ноя 2013, 15:32

Foenix,
можно всё таки примерчик, как в потоке писать в DB?
он мне не даёт никак, вылетает с исключением

Код: Выделить всё

   public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
      // --- Local_DB_Structur --------------
      ID = "id";
      PID = "pid";
      TITLE = "title";
      TEXT= "text";
      final String SQL_CREATE_ENTRIES="CREATE TABLE IF NOT EXISTS "
              + LOCAL_TABLE_NAME+" ("+ID+" INT, "
              + PID+" INT, "
              + TITLE+" VARCHAR(255), "
              + TEXT+" VARCHAR(255))";
      db.execSQL(SQL_CREATE_ENTRIES);
      // ------------------------------------
      try {
        Thread t = new Thread(new Runnable() {
          public void run() {
            Log.d(LOG_TAG,">>> Thread is created");

            Connection conn = null;

            String sServerName = "10.0.2.2:3306";
            String sDBName = "jugendkultur";

            Properties properties = new Properties();
            properties.setProperty("user", "root");
            properties.setProperty("password", "");
            properties.setProperty("useUnicode", "true");
            properties.setProperty("characterEncoding", "UTF-8");
            properties.setProperty("autoReconnect", "true");

            try {
              Class.forName("com.mysql.jdbc.Driver");
              Log.d(LOG_TAG,">>> jdbc.Driver: instance successful");
            } catch (Exception e) {
              Log.d(LOG_TAG,">>> jdbc.Driver: instance error");
              e.printStackTrace();
            }

            try {
              conn=DriverManager.getConnection("jdbc:mysql://"+sServerName+"/"+sDBName,properties);
              Log.d(LOG_TAG,">>> jdbc.Driver: connect successful");
 
              String query = "SELECT id, pid, title, language FROM `tl_page` WHERE language <> ''";

              Log.d(LOG_TAG,">>> Query: "+query);

              Statement s;
              try {
                s=conn.createStatement();
                s.executeQuery(query);

                ResultSet rs;
                rs = s.getResultSet();

                // ~~~~~~~~~ Создание локальной базы данных ~~~~~~~~~~~~~~~~
                // создаем объект для данных
                ContentValues cv = new ContentValues();

                while (rs.next()) {
                  String id=rs.getString("id");
                  String pid=rs.getString("pid");
                  String title=rs.getString("title");
                  String language=rs.getString("language");

                  Log.d(LOG_TAG, "{id="+id+"; pid="+pid+"; title="+title+"; language="+language+"}");

//                  Log.d(LOG_TAG, "--- Insert in mytable: ---");
                  // подготовим данные для вставки в виде пар: наименование столбца -
                  // значение
                  cv.put("id",id);
                  cv.put("pid", pid);
                  cv.put("title", title);
                  // вставляем запись и получаем ее ID
                  long rowID = db.insert(LOCAL_TABLE_NAME, null, cv);
                  dbInsert(LOCAL_TABLE_NAME, null, cv);
                  Log.d(LOG_TAG, "row inserted, ID = " + rowID);
                }
                Log.d(LOG_TAG,"### Created: "+SQL_CREATE_ENTRIES+" ###");
.......
вот в этой строке
db.insert(LOCAL_TABLE_NAME, null, cv);
компилятор ругается что db не final
а если её сделать final, тогда естественно ловим исключение

Код: Выделить всё

ERROR/AndroidRuntime(27670): FATAL EXCEPTION: Thread-8
        java.lang.IllegalStateException: database not open
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1493)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410)
        at com.example.Todo_List.DBHelper$1.run(DBHelper.java:138)
        at java.lang.Thread.run(Thread.java:1096)

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Android и MySQL

Сообщение Foenix » 08 ноя 2013, 17:57

Вот ты упрямый, а? я ж тебе предложила другой вариант, правильный..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Android и MySQL

Сообщение Isaev » 11 ноя 2013, 10:10

да вроде разобрался... после выходных всё стало прозрачнее)

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Android и MySQL

Сообщение Isaev » 13 ноя 2013, 15:21

Foenix, выборочно считал, создал локальную бд
Но пара вопросов ещё остались:
1. Надо ли задуматься о том моменте, что база создаётся в потоке?
ведь по идее пока поток не отработал до конца, я не должен бы к ней обращаться иначе будут валиться исключения
как-то надо дождаться его завершения прежде, чем работать дальше?

2.

Код: Выделить всё

  SQLiteDatabase mdb;
  mdb=getWritableDatabase();
  mdb.execSQL(queryStr);
...
как ответ получить в ResultSet? Все методы SQLiteDatabase возвращают Cursor

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Android и MySQL

Сообщение Foenix » 13 ноя 2013, 16:21

Вот поэтому нужно использовать ContentProvider - он сам руководит доступом, никогда исключений с доступом не будет. Вообще говоря - читать можно базу сколько угодно потоков, а вот писать - по очереди.

Ответ нельзя получить в ResultSet, только курсор - в чем проблема?

и третье. Зачем тебе для запроса getWritableDatabase? достаточно readble копии.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Android и MySQL

Сообщение Isaev » 14 ноя 2013, 11:02

Foenix писал(а):Вот поэтому нужно использовать ContentProvider - он сам руководит доступом, никогда исключений с доступом не будет. Вообще говоря - читать можно базу сколько угодно потоков, а вот писать - по очереди.
а его инициализировать обязательно из отдельного приложения? к сожалению тут урок построен именно так...
Глупо же, как минимум в данном случае... Зачем пользователю ставить один апп, чтобы потом заработал другой?
Foenix писал(а):Ответ нельзя получить в ResultSet, только курсор - в чем проблема
для программиста нет слова нельзя! ;) Обычно это или лень или отсутствие интереса... Проблеммы нет) просто интересно стало. Если на вход резалтсет даём, почему бы его же и не получать?
Всё можно, но пока, что нашёл в сети, как-то страшно реализовано
По идее ResultSet правильнее, т.к. он не получает всю выборку сразу, а постепенно по мере обращения получает "окошко", которое задаём в setFetchSize()... т.е. если мы обходим данные и в один момент понимаем, что дальше они не нужны, то они просто не будут получены! а Cursor получает их сразу в полном объёме, потому у него, в отличии от ResultSet есть метод getCount(), т.к. он всё получил сразу и знает сколько у нас записей

на счет третьего, согласен

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Android и MySQL

Сообщение Foenix » 14 ноя 2013, 21:53

Про контент-провайдеры есть не только урок, а записанный мною вебинар, доступный тут
http://www.youtube.com/watch?v=QEqGgmMkRDk

Насчет твоего второго... у тебя свое какое-то особенное видение, поэтому даже говорить ничего не буду) Все дело в том, что "по-нормальному" это все реализоваывается совершенно другими способами, а не через резалтсет. Потому что курсор - это всего лишь хранилище. Сколько туда запишешь, столько и будет отображаться. Механизмы получить только то, что ограничено, наприер, несколькими строками вообще другие.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Android и MySQL

Сообщение Isaev » 15 ноя 2013, 10:18

Foenix писал(а):Механизмы получить только то, что ограничено, наприер, несколькими строками вообще другие.
очень интересно. например? :)
не всё возможно отфильтровать в запросе.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Android и MySQL

Сообщение Foenix » 15 ноя 2013, 12:21

Isaev писал(а):
Foenix писал(а):Механизмы получить только то, что ограничено, наприер, несколькими строками вообще другие.
очень интересно. например? :)
не всё возможно отфильтровать в запросе.
угу, если вы мне сейчас объясните, в чем сходство между "отфильтровать в запросе" и тем, о чем мы говорили до этого.
И для справки. "в запросе" можно "отфильтровать" очень и очень многое. Вам это даже и не снилось.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Android и MySQL

Сообщение Isaev » 18 ноя 2013, 10:30

Foenix, хорошо... как отфильтровать в запросе все записи, первые 6 символов у которых одинаковые, а последний символ - 'Z'? И таких записей надо взять первые 20шт. Остальные условия отфильтровываются запросом.
Мне много чего снилось) Такое я в SQL мало представляю, буду рад примеру.
Потом в цикле я могу считать и кол-во и проверять символы и прерваться когда нужно.
И не надо говорить, что нужно иначе создавать бд, чтобы не заниматься такой ерундой... Не я её создавал, я просто организовываю доступ к готовой)

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Android и MySQL

Сообщение Foenix » 18 ноя 2013, 11:18

что значит "иначе создавать бд?" я вашу бд и не видела. Дайте таблицу - я покажу как это сделать в запросе. В цикле это делать - нельзя, теряется производительность раз в 100.
и еще не поняла, что значит "первые 6 символов одинаковые"? ЭТо значит, они соответсвуют какой-то строке? Тогда все не просто, а очень просто.

select * from my_table where my_field like 'ABC%' and my_field like '%Z' limit 20
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить