Страница 8 из 10
Re: Android и MySQL
Добавлено: 07 ноя 2013, 13:17
Alt
Foenix писал(а):при подключении к ms sql нужен другой драйвер. Сто раз тут обсуждалось.
Да, да, я уточняю что у меня проблема именно в этом
не ругайтесь))
Re: Android и MySQL
Добавлено: 07 ноя 2013, 13:31
Isaev
Alt, эту тему с самого начала и тут ещё почитай
viewtopic.php?f=41&t=1876
Re: Android и MySQL
Добавлено: 07 ноя 2013, 14:03
Alt
Да спасибо, читал) я понял что изначально у вас недопонимание сложилось ты подключался к майскл через jtds, а тебе советы давали касаемо другого драйвера. когда же ты другой драйвер взял все получилось(исключим ошибку локалхоста, и подключения драйверов) это я уже поборол). у меня просто когда я подключался с драйвером мускл к мсскл выходила ошибка сокетов, то есть конект идет но сервак не пускает. я сейчас пробую jtdc подсключить и спомощью него подключиться.
Re: Android и MySQL
Добавлено: 07 ноя 2013, 14:08
Alt
чтобы предметно говорить код выложу
[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 находящуюся в сети. использую эмулятор
Re: Android и MySQL
Добавлено: 07 ноя 2013, 14:23
Foenix
обсуждается все в куче, т.к. кроме драйвера различий нету никаких
Re: Android и MySQL
Добавлено: 07 ноя 2013, 14:26
Isaev
Alt, сложилось мнение, что если не в отдельном потоке подключаться - работает не корректно, а в большинстве случаев и вовсе не работает
уж не знаю почему, но на практике тоже помогает, хотя прямой зависимости я не вижу)
Re: Android и MySQL
Добавлено: 07 ноя 2013, 16:51
Alt
Вообщем взял за основу код Исаева, но использовал другой драйвер для подключения (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) еррор ))
Re: Android и MySQL
Добавлено: 07 ноя 2013, 19:39
Foenix
да, в зависимости от версии могут быть ошибки.. КОннект - ищите несоответствие уже далее - пароль, сервер не слушает tcp ip или еще что-нибудь такое.
Re: Android и MySQL
Добавлено: 08 ноя 2013, 10:14
Isaev
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");
}
Re: Android и MySQL
Добавлено: 08 ноя 2013, 15:32
Isaev
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)
Re: Android и MySQL
Добавлено: 08 ноя 2013, 17:57
Foenix
Вот ты упрямый, а? я ж тебе предложила другой вариант, правильный..
Re: Android и MySQL
Добавлено: 11 ноя 2013, 10:10
Isaev
да вроде разобрался... после выходных всё стало прозрачнее)
Re: Android и MySQL
Добавлено: 13 ноя 2013, 15:21
Isaev
Foenix, выборочно считал, создал локальную бд
Но пара вопросов ещё остались:
1. Надо ли задуматься о том моменте, что база создаётся в потоке?
ведь по идее пока поток не отработал до конца, я не должен бы к ней обращаться иначе будут валиться исключения
как-то надо дождаться его завершения прежде, чем работать дальше?
2. Код: Выделить всё
SQLiteDatabase mdb;
mdb=getWritableDatabase();
mdb.execSQL(queryStr);
...
как ответ получить в ResultSet? Все методы SQLiteDatabase возвращают Cursor
Re: Android и MySQL
Добавлено: 13 ноя 2013, 16:21
Foenix
Вот поэтому нужно использовать ContentProvider - он сам руководит доступом, никогда исключений с доступом не будет. Вообще говоря - читать можно базу сколько угодно потоков, а вот писать - по очереди.
Ответ нельзя получить в ResultSet, только курсор - в чем проблема?
и третье. Зачем тебе для запроса getWritableDatabase? достаточно readble копии.
Re: Android и MySQL
Добавлено: 14 ноя 2013, 11:02
Isaev
Foenix писал(а):Вот поэтому нужно использовать ContentProvider - он сам руководит доступом, никогда исключений с доступом не будет. Вообще говоря - читать можно базу сколько угодно потоков, а вот писать - по очереди.
а его инициализировать обязательно из отдельного приложения? к сожалению тут урок построен именно так...
Глупо же, как минимум в данном случае... Зачем пользователю ставить один апп, чтобы потом заработал другой?
Foenix писал(а):Ответ нельзя получить в ResultSet, только курсор - в чем проблема
для программиста нет слова нельзя!
Обычно это или лень или отсутствие интереса... Проблеммы нет) просто интересно стало. Если на вход резалтсет даём, почему бы его же и не получать?
Всё можно, но пока, что нашёл в сети, как-то страшно реализовано
По идее ResultSet правильнее, т.к. он не получает всю выборку сразу, а постепенно по мере обращения получает "окошко", которое задаём в setFetchSize()... т.е. если мы обходим данные и в один момент понимаем, что дальше они не нужны, то они просто не будут получены! а Cursor получает их сразу в полном объёме, потому у него, в отличии от ResultSet есть метод getCount(), т.к. он всё получил сразу и знает сколько у нас записей
на счет третьего, согласен
Re: Android и MySQL
Добавлено: 14 ноя 2013, 21:53
Foenix
Про контент-провайдеры есть не только урок, а записанный мною вебинар, доступный тут
http://www.youtube.com/watch?v=QEqGgmMkRDk
Насчет твоего второго... у тебя свое какое-то особенное видение, поэтому даже говорить ничего не буду) Все дело в том, что "по-нормальному" это все реализоваывается совершенно другими способами, а не через резалтсет. Потому что курсор - это всего лишь хранилище. Сколько туда запишешь, столько и будет отображаться. Механизмы получить только то, что ограничено, наприер, несколькими строками вообще другие.
Re: Android и MySQL
Добавлено: 15 ноя 2013, 10:18
Isaev
Foenix писал(а):Механизмы получить только то, что ограничено, наприер, несколькими строками вообще другие.
очень интересно. например?
не всё возможно отфильтровать в запросе.
Re: Android и MySQL
Добавлено: 15 ноя 2013, 12:21
Foenix
Isaev писал(а):Foenix писал(а):Механизмы получить только то, что ограничено, наприер, несколькими строками вообще другие.
очень интересно. например?
не всё возможно отфильтровать в запросе.
угу, если вы мне сейчас объясните, в чем сходство между "отфильтровать в запросе" и тем, о чем мы говорили до этого.
И для справки. "в запросе" можно "отфильтровать" очень и очень многое. Вам это даже и не снилось.
Re: Android и MySQL
Добавлено: 18 ноя 2013, 10:30
Isaev
Foenix, хорошо... как отфильтровать в запросе все записи, первые 6 символов у которых одинаковые, а последний символ - 'Z'? И таких записей надо взять первые 20шт. Остальные условия отфильтровываются запросом.
Мне много чего снилось) Такое я в SQL мало представляю, буду рад примеру.
Потом в цикле я могу считать и кол-во и проверять символы и прерваться когда нужно.
И не надо говорить, что нужно иначе создавать бд, чтобы не заниматься такой ерундой... Не я её создавал, я просто организовываю доступ к готовой)
Re: Android и MySQL
Добавлено: 18 ноя 2013, 11:18
Foenix
что значит "иначе создавать бд?" я вашу бд и не видела. Дайте таблицу - я покажу как это сделать в запросе. В цикле это делать - нельзя, теряется производительность раз в 100.
и еще не поняла, что значит "первые 6 символов одинаковые"? ЭТо значит, они соответсвуют какой-то строке? Тогда все не просто, а очень просто.
select * from my_table where my_field like 'ABC%' and my_field like '%Z' limit 20