Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
NOSC
43 / 43 / 3
Регистрация: 10.10.2013
Сообщений: 297
#1

SQLite в Service - Программирование Android

02.06.2014, 10:17. Просмотров 994. Ответов 9
Метки нет (Все метки)

Всем привет!
Коллеги, возможно ли подключаться к базе и выполнять с ней все действия из Сервиса. Активити у меня нет, в программе 3 класса, это Экран настроект (он же единственный интерфейс для юзера), DataBaseHelper и, собственно, класс моего сервиса.

Пытался в сервисе в OnCreate поставить подклбчение к базе - не подключается, в действии OnStart так же не хочет подключать базу и делать ее "читаемой\записываемой"

Спасибо
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2014, 10:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос SQLite в Service (Программирование Android):

SQLite из Service - Программирование Android
Здравствуйте, у меня такой вопрос. Уже бьюсь 2 дня, ни как не могу сделать. Может вы мне поможете советом, а лучше примером. Как...

Service - Программирование Android
Как создать приложение как Service?

Работа с Service - Программирование Android
Всем добрый вечер! Есть приложение под андроид. С активити, с интерфейсом, всё как нужно. Теперь потребовалось сделать из него фоновое...

App Service - Программирование Android
Возможно ли как-то создать приложение, которое запускает сервис и при этом, если в дальнейшем удалить само приложение, то сервис останется...

Fragments и service - Программирование Android
такой вопрос как реализовать запуск сервиса и обработку результатов приложении где есть fragments.? хотелось бы запускать сервис в...

GPS service - Программирование Android
Написал сервис для работы GPS однако при попытке вытащить данные просто выдаёт 0 класс реализующий работу c GPS: package...

9
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
02.06.2014, 10:34 #2
NOSC, возможно, почему нет. Что нужно для инстанса БД? Правильно, context А Activity и Service оба наследуют его, так что какие проблемы.
1
NOSC
43 / 43 / 3
Регистрация: 10.10.2013
Сообщений: 297
02.06.2014, 10:42  [ТС] #3
Цитата Сообщение от YuraAAA Посмотреть сообщение
NOSC, возможно, почему нет. Что нужно для инстанса БД? Правильно, context А Activity и Service оба наследуют его, так что какие проблемы.
__________________
Что тогда делаю не правильно? Почему возникает проблема с подключением??
В логе нет информации о том что к базе подключение произошло и мой quary возвращается с NULLPOINT и, соответственно, ошибка и остановка сервиса
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
02.06.2014, 11:17 #4
NOSC, покажите как Вы подключаете базу
1
NOSC
43 / 43 / 3
Регистрация: 10.10.2013
Сообщений: 297
06.06.2014, 17:16  [ТС] #5
Цитата Сообщение от YuraAAA Посмотреть сообщение
NOSC, покажите как Вы подключаете базу
Да собственно все подключается, не могу разобраться с ошибкой. Лог ниже:
Кликните здесь для просмотра всего текста
06-06 15:37:51.048: D/myLogs(14670): onCreate
06-06 15:37:51.048: D/myLogs(14670): onStartCommand
06-06 15:37:51.048: I/System.out(14670): Cell ID = 878078
06-06 15:37:51.058: I/SQLiteAssetHelper(14670): successfully opened database metrotrace.db
06-06 15:37:51.058: D/AndroidRuntime(14670): Shutting down VM
06-06 15:37:51.058: W/dalvikvm(14670): threadid=1: thread exiting with uncaught exception (group=0x40d2e930)
06-06 15:37:51.058: E/AndroidRuntime(14670): FATAL EXCEPTION: main
06-06 15:37:51.058: E/AndroidRuntime(14670): java.lang.RuntimeException: Unable to start service com.site.myservice.BaseStation@40fc7b80 with Intent { cmp=com.site.myservice/.BaseStation }: java.lang.IllegalArgumentException: the bind value at index 1 is null


Вот так сам сервис выглядит:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class BaseStation extends Service {
    final String LOG_TAG = "myLogs";
    String station_name;
    GsmCellLocation location;
    DataBase db;
    Cursor cursor;
    
    public void onCreate() {
        super.onCreate();
        Log.d(LOG_TAG, "onCreate");
        
      }
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(LOG_TAG, "onStartCommand");
        getLocation();
        return super.onStartCommand(intent, flags, startId);
      }
      public void onDestroy() {
            super.onDestroy();
            Log.d(LOG_TAG, "onDestroy");
          }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    
    void getLocation() {
        TelephonyManager tm  = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        location = (GsmCellLocation) tm.getCellLocation();
            Data.now_cellid = location.getCid();
            System.out.println("Cell ID = " + Data.now_cellid);
          simileDo();
    }
    void simileDo(){
        if (Data.now_cellid != Data.old_cellid) {
            choiceDb();
        } else {
            getLocation();
        }
    }
    void choiceDb() {
        db = new DataBase(this);
        cursor = db.doSomething(station_name);
    }
 
}


А вот так Курсор в helper'е :
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public Cursor doSomething(String station) {
        SQLiteDatabase db = getWritableDatabase();
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        //1. Составляем запрос
        Cursor cursor = getWritableDatabase().rawQuery("SELECT * FROM mts WHERE cellid=?", new String[]{station});
        //2. Курсор должен быть не null и что-то в себе нести
        if (cursor != null && cursor.moveToFirst()) {
            String name = cursor.getString(cursor.getColumnIndex("station"));
            Log.d("Database", name);
            Data.now_station = name;
            
        }
        //3. Курсор обязательно закрываем
        closeCursor(cursor);
        return cursor;
    }
    
    private void closeCursor(Cursor c) {
        if (c != null && !c.isClosed()) {
            c.close();
        }
    }


Добавлено через 1 час 33 минуты
Поменял немного формат запроса, подглядел в программе, которая составляет запросы к базе sqlite, теперь мой класс helper выглядит так:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class DataBase extends SQLiteAssetHelper{
    private static final String DATABASE_NAME = "metrotrace.db";
    private static final int DATABASE_VERSION = 1;
    public static final String COLUMN_ID = "id";
    public static final String COLUMN_LOC = "cellid";
    public static final String COLUMN_ST = "station";
    SQLiteDatabase db = getWritableDatabase();
    public DataBase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
 
 
    }
    public Cursor doSomething(String station) {
        //1. Составляем запрос
        Cursor cursor = getWritableDatabase().rawQuery("SELECT station FROM mts WHERE cellid="+Data.now_cellid+" ORDER BY station ASC", new String[]{station});
        //2. Курсор должен быть не null и что-то в себе нести
        if (cursor != null && cursor.moveToFirst()) {
            String name = cursor.getString(cursor.getColumnIndex("station"));
            Log.d("Database", name);
            Data.now_station = name;
            
        }
        //3. Курсор обязательно закрываем
        closeCursor(cursor);
        return cursor;
    }
    
    private void closeCursor(Cursor c) {
        if (c != null && !c.isClosed()) {
            c.close();
        }
    }
}


Ошибка изменилась:
Кликните здесь для просмотра всего текста
06-06 16:56:57.669: D/myLogs(19811): onCreate
06-06 16:56:57.669: D/myLogs(19811): onStartCommand
06-06 16:56:57.679: I/System.out(19811): Cell ID = 878078
06-06 16:56:57.689: I/SQLiteAssetHelper(19811): successfully opened database metrotrace.db
06-06 16:56:57.699: D/AndroidRuntime(19811): Shutting down VM
06-06 16:56:57.699: W/dalvikvm(19811): threadid=1: thread exiting with uncaught exception (group=0x40d2e930)
06-06 16:56:57.699: E/AndroidRuntime(19811): FATAL EXCEPTION: main
06-06 16:56:57.699: E/AndroidRuntime(19811): java.lang.RuntimeException: Unable to start service com.site.myservice.BaseStation@40fcb328 with Intent { cmp=com.site.myservice/.BaseStation }: java.lang.IllegalArgumentException: the bind value at index 1 is null
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2800)
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.app.ActivityThread.access$1900(ActivityThread.java:153)
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.os.Handler.dispatchMessage(Handler.java:99)
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.os.Looper.loop(Looper.java:137)
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.app.ActivityThread.main(ActivityThread.java:5226)
06-06 16:56:57.699: E/AndroidRuntime(19811): at java.lang.reflect.Method.invokeNative(Native Method)
06-06 16:56:57.699: E/AndroidRuntime(19811): at java.lang.reflect.Method.invoke(Method.java:511)
06-06 16:56:57.699: E/AndroidRuntime(19811): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
06-06 16:56:57.699: E/AndroidRuntime(19811): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
06-06 16:56:57.699: E/AndroidRuntime(19811): at dalvik.system.NativeStart.main(Native Method)
06-06 16:56:57.699: E/AndroidRuntime(19811): Caused by: java.lang.IllegalArgumentException: the bind value at index 1 is null
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164)
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
06-06 16:56:57.699: E/AndroidRuntime(19811): at com.site.myservice.DataBase.doSomething(DataBase.java:24)
06-06 16:56:57.699: E/AndroidRuntime(19811): at com.site.myservice.BaseStation.choiceDb(BaseStation.java:55)
06-06 16:56:57.699: E/AndroidRuntime(19811): at com.site.myservice.BaseStation.simileDo(BaseStation.java:48)
06-06 16:56:57.699: E/AndroidRuntime(19811): at com.site.myservice.BaseStation.getLocation(BaseStation.java:44)
06-06 16:56:57.699: E/AndroidRuntime(19811): at com.site.myservice.BaseStation.onStartCommand(BaseStation.java:26)
06-06 16:56:57.699: E/AndroidRuntime(19811): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2783)
06-06 16:56:57.699: E/AndroidRuntime(19811): ... 10 more
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
06.06.2014, 18:41 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от NOSC Посмотреть сообщение
String station_name;
у Вас он null. Соответственно, когда Вы передаёте его как аргумент в базу, выпадает ошибка.
Цитата Сообщение от NOSC Посмотреть сообщение
("SELECT * FROM mts WHERE cellid=?", new String[]{station})
получается что station тут null, и получается ошибка.
1
NOSC
43 / 43 / 3
Регистрация: 10.10.2013
Сообщений: 297
07.06.2014, 00:19  [ТС] #7
Цитата Сообщение от YuraAAA Посмотреть сообщение
Сообщение от NOSC
("SELECT * FROM mts WHERE cellid=?", new String[]{station})
получается что station тут null, и получается ошибка.
Я правильно понимаю, что в моем случае должно быть:
("SELECT * FROM mts WHERE station=?", new String[]{cellid})

если cllid известен, и надо узнать station ему соответствующий?

Добавлено через 2 часа 42 минуты
Коллеги, кто знает, поправьте меня что не так делаю:

Вот мой курсор:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public Cursor doSomething(String station) {
//        //1. Составляем запрос
        Cursor cursor = getWritableDatabase().rawQuery("SELECT station FROM mts WHERE cellid=?"+String.valueOf(Data.now_cellid), new String[]{station});
//        //2. Курсор должен быть не null и что-то в себе нести
        if (cursor != null && cursor.moveToFirst()) {
            String name = cursor.getString(cursor.getColumnIndex("cellid"));
            Log.d("Database", name);
            Data.now_station = name;
            
        }
//        //3. Курсор обязательно закрываем
        closeCursor(cursor);
        return cursor;
        
        
    }
Как я понял - он должен мне возвращать значение из ячейки <station> по ColumnIndex("cellid")
Вот что я в лог получаю:
Кликните здесь для просмотра всего текста
06-06 23:35:13.544: D/myLogs(4845): onCreate
06-06 23:35:13.544: D/myLogs(4845): onStartCommand
06-06 23:35:13.544: I/System.out(4845): Cell ID = 7110594
06-06 23:35:13.564: I/SQLiteAssetHelper(4845): successfully opened database metrotrace.db
06-06 23:35:13.564: E/SQLiteLog(4845): (1) variable number must be between ?1 and ?999
06-06 23:35:13.564: D/AndroidRuntime(4845): Shutting down VM

в таблице поля _id, cellid text, station text

Добавлено через 40 минут
Проблема решена методом научного тыка, вот правильный курсор, может кому пригодится.

Java
1
2
3
4
5
6
7
8
9
    public Cursor doSomething(String cellid) {
        Cursor cursor = getWritableDatabase().rawQuery("SELECT mts.station FROM mts WHERE cellid=?", new String[]{cellid});
        if (cursor != null && cursor.moveToFirst()) {
            String name = cursor.getString(cursor.getColumnIndex("station"));
            Log.d("Database", name);
            Data.now_station = name;
        }
        closeCursor(cursor);
        return cursor;
Всем Спасибо!
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
07.06.2014, 13:46 #8
Вы опять же не проверяете cellid на null
0
NOSC
43 / 43 / 3
Регистрация: 10.10.2013
Сообщений: 297
08.06.2014, 12:53  [ТС] #9
Цитата Сообщение от YuraAAA Посмотреть сообщение
Вы опять же не проверяете cellid на null
А зачем??
Когда cellid = null, он воспринимается как 0 в курсоре и в команде для sqlite выбор идет по значению 0, соответственно курсор=null и просто закрывается

Или я что-то не понимаю?

По крайней мере попробовал, приложение не вылетает, курсор отрабатывает 0 и закрывается

Добавлено через 20 часов 7 минут
Да, действительно, при cellid = null сервис вылетает. Сделал проще, в теле сервиса прописал if (cellid != null) тогда старт курсор.

СПасибо
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
08.06.2014, 13:14 #10
Цитата Сообщение от NOSC Посмотреть сообщение
Когда cellid = null, он воспринимается как 0 в курсоре
не а)) будет
Цитата Сообщение от NOSC Посмотреть сообщение
Unable to start service com.site.myservice.BaseStation@40fc7b80 with Intent { cmp=com.site.myservice/.BaseStation }: java.lang.IllegalArgumentException: the bind value at index 1 is null
0
08.06.2014, 13:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 13:14
Привет! Вот еще темы с ответами:

Автозагрузка Service - Программирование Android
Привет, люди! Давно бьюсь с автозапуском сервисов. Скиньте, пожалуйста РАБОЧИЙ пример сего действа, иначе я вообще никогда так и не...

Android и Web Service - Программирование Android
Написал веб сервис который формирует массив из трех значений, нужно написать андроид приложение, чтоб выводил их . Как этого добиться,...

Подружить receiver и service - Программирование Android
вообщем такая ситуация. У меня есть сервис который каждые 10 минут отправляет данные на сервер. Мне нужно сделать так чтоб этот сервис...

Запуск activity из service - Программирование Android
Добрый вечер! Как правильно запускать активность из сервиса? Метод startActivity(new Intent(this,MyActivity.class)); не работает,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru