Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.83
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
#1

База SqLite - проверка записей на существование - Программирование Android

21.05.2013, 20:39. Просмотров 4004. Ответов 16
Метки нет (Все метки)

Помоги разрешить следующую ситуацию.

у меня есть метод который получает данные из интернета в Json. Я данные разбираю и записываю в базу данных:

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
    try {
                        for (int i = 0; i < jsonM.length(); i++) {
                            JSONObject c = jsonM.getJSONObject(i);
                            String id_op = c.getString("id");
                            String cat = c.getString("cat");
                            String title = c.getString("title");
                            String updated = c.getString("updated");
                            String de = c.getString("desc");
                            String count = c.getString("count");
                                    
                            // создаем объект для данных
                            ContentValues cv = new ContentValues();
 
                            // подключаемся к БД
                            SQLiteDatabase db = dbHelper.getWritableDatabase();
                              Log.d(LOG_TAG, "--- Insert in myDB: ---");
                              // подготовим данные для вставки в виде пар: наименование столбца - значение
                              cv.put("id_op ", id_op );
                              cv.put("cat", cat);
                              cv.put("title", title);
                              cv.put("updated", updated);
                              cv.put("de", de);
                              cv.put("count", count);
 
                              // вставляем запись и получаем ее ID
                              long rowID = db.insert("myDB", null, cv);
                              Log.d(LOG_TAG, "row inserted myDB, ID = " + rowID);
                            //
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        System.out.println(" List GET - Ошибка");
                    }
всё работает, данные записываются в базу. Но при следующем запуске приложения это код опять запускается и повторно записывает данные в базу.

Вопрос. Скажите, приведите пример (очень долго мучаюсь) как проверить есть ли уже эти данные в базе, если есть то не записывать, а если какие-то новые данные с Json пришли вот их записать в базу. Т.е. как бы обновлять базу, но не стирать и заново всё записывать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.05.2013, 22:46     База SqLite - проверка записей на существование #2
http://stackoverflow.com/questions/1...ist-and-update
http://stackoverflow.com/questions/9...-if-not-exists
http://www.buzzingandroid.com/2013/0...ntentprovider/
JIyrApy
32 / 32 / 1
Регистрация: 22.08.2010
Сообщений: 244
21.05.2013, 22:48     База SqLite - проверка записей на существование #3
Ну вот, судя по коду id в БД пишется. Если уникальный, по нему и смотрите. Если есть запись с таким id - значит не записывать, если нету - значит записывать. Опять же, можно так, если id есть значить обновить запись с этим id, если нету - записать данные с новым id
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
22.05.2013, 01:09  [ТС]     База SqLite - проверка записей на существование #4
А можно пример. Просто у меня проблема с тем как это воспроизвести.?

У меня приходят данные:

Java
1
2
3
4
5
6
7
8
for (int i = 0; i < jsonM.length(); i++) {
                            JSONObject c = jsonM.getJSONObject(i);
                            String id_op = c.getString("id");
                            String cat = c.getString("cat");
                            String title = c.getString("title");
                            String updated = c.getString("updated");
                            String de = c.getString("desc");
                            String count = c.getString("count");
они в цикле. Мне нужно это значение String id_op сравнить со значением в базе. Значит надо взять значение String id_op пробежать по всей базе и если не найти совпадения то сделать:

Java
1
2
3
4
5
6
 cv.put("id_op ", id_op );
                              cv.put("cat", cat);
                              cv.put("title", title);
                              cv.put("updated", updated);
                              cv.put("de", de);
                              cv.put("count", count);
а если найти, то необходимо перейти по циклу JSON данных дальше. Очень прошу пример. Очень сложно понимается всё.

Добавлено через 2 часа 1 минуту
А исправьте мне метод, который пробегается по базе и если находит преданное ему на вход значение возвращает true

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public String getContact(int id) {
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    Cursor cursor = db.query(TABLE_MY_DB_TOP, new String[] { KEY_ID,
            KEY_CATEGORY, KEY_TITLE }, KEY_ID + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();
 
    Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
            cursor.getString(1), cursor.getString(2));
     return contact
  
}
JIyrApy
32 / 32 / 1
Регистрация: 22.08.2010
Сообщений: 244
22.05.2013, 07:21     База SqLite - проверка записей на существование #5
Вот, как то так. Ищем id в таблице и если количество записей в курсоре больше нуля - значит такая запись есть и возвращаем true.
Java
1
2
3
4
5
6
7
8
9
10
11
12
public boolean getContact(int id) {
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    boolean ch=false;
    Cursor cursor = db.query(TABLE_MY_DB_TOP, new String[] { KEY_ID,
            KEY_CATEGORY, KEY_TITLE }, KEY_ID + " = "+id,
            null, null, null, null, null);
    if (cursor.getCount() > 0)
        ch=true;
 
     return ch
  
}
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
22.05.2013, 11:20  [ТС]     База SqLite - проверка записей на существование #6
а здесь же надо наверное закрывать курсор и db ? вот так:

cursor.close();
db.close();

return ch;
JIyrApy
32 / 32 / 1
Регистрация: 22.08.2010
Сообщений: 244
22.05.2013, 13:54     База SqLite - проверка записей на существование #7
Ну по логике надо соединение закрывать, если не предполагается дальнейшее использование этого соединения.
Если пишите класс, расширяющий активность и база используется во многих местах, то можно в onCreate базу открыть, а потом, в onDestroy, onStop, onBackPressed закрыть. Только вот с onStop и onBackPressed надо быть поосторожней, если по программе предполагается возврат в эту, уже созданную активность.
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
22.05.2013, 15:27  [ТС]     База SqLite - проверка записей на существование #8
Мне нужна сделать выборку из базы типа: SELECT id_top, title FROM myDBTop WHERE KEY_CATEGORY=Cinema ORDER BY title
Как этот код ниже переделать?

Java
1
2
3
4
5
Cursor friendCursor = database.query(TABLE_MY_DB_TOP,
                     new String[] 
                     {KEY_ID, KEY_TITLE},
                     KEY_CATEGORY, null, null, null
                     , KEY_TITLE);
JIyrApy
32 / 32 / 1
Регистрация: 22.08.2010
Сообщений: 244
22.05.2013, 17:10     База SqLite - проверка записей на существование #9
Java
1
2
Cursor friendCursor = database.query(TABLE_MY_DB_TOP,
                     new String[]{KEY_ID, KEY_TITLE}, KEY_CATEGORY+" = 'Cinema'", null, null, null, KEY_TITLE);
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
24.05.2013, 18:20  [ТС]     База SqLite - проверка записей на существование #10
А как сделать выборку из базы, если я зная id хочу из этой строчки достать например значение столбца title и значение столбца date. и положить это в в HashMap типа (HashMap<String, String>()) ?
JIyrApy
32 / 32 / 1
Регистрация: 22.08.2010
Сообщений: 244
25.05.2013, 09:24     База SqLite - проверка записей на существование #11
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
Cursor cursor=db.query(TABLE_MY_DB_TOP, new String[] {KEY_TITLE, KEY_DATE}, KEY_ID+" = "+_id, null, null, null, null);
                  
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm dd.MM.yyyy");
            
 
           if(cursor.moveToFirst()){
               String curT=cursor.getString(cursor.getColumnIndex(KEY_TITLE));
                           long d=cursor.getLong(cursor.getColumnIndex(KEY_DATE));
                            Date ccct=new Date(d);
                           String curD = sdf.format(ccct);
                           
           }
curT и curD переменные типа String и с ними можно делать че хочешь.
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
29.05.2013, 18:55  [ТС]     База SqLite - проверка записей на существование #12
Подскажите как составить запрос на получение количества записей у столбца DATA у строк которые имеют id 9 ?
JIyrApy
32 / 32 / 1
Регистрация: 22.08.2010
Сообщений: 244
30.05.2013, 13:17     База SqLite - проверка записей на существование #13
Ну то есть получается количество записей с id=9, так?
Java
1
2
Cursor cursor=db.query(TABLE_MY_DB_TOP, new String[] {KEY_DATE}, KEY_ID+" = "+9, null, null, null, null);
return cursor.getCount();
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
30.05.2013, 16:15  [ТС]     База SqLite - проверка записей на существование #14
Цитата Сообщение от JIyrApy Посмотреть сообщение
Ну то есть получается количество записей с id=9, так?
да, так.

Добавлено через 1 час 56 минут
Цитата Сообщение от JIyrApy Посмотреть сообщение
Cursor cursor=db.query(TABLE_MY_DB_TOP, new String[] {KEY_DATE}, KEY_ID+" = "+9, null, null, null, null);
return cursor.getCount();
почему-то всегда возвращает, что есть запись. Даже ели её там нет...
JIyrApy
32 / 32 / 1
Регистрация: 22.08.2010
Сообщений: 244
30.05.2013, 17:23     База SqLite - проверка записей на существование #15
Значит все-таки есть запись с таким id. Попробуйте скачать БД на комп и открыть ее какой-нить программой, чтобы посмотреть содержимое. На крайняк - блокнотом, тоже реально проследить содержимое и структуру БД.
Или удалите все записи из таблицы и попробуйте снова сделать запрос. Наверняка результат будет нулевым
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
30.05.2013, 17:34  [ТС]     База SqLite - проверка записей на существование #16
Я как раз и смотрю содержимое базы локально и вижу что её там нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 17:37     База SqLite - проверка записей на существование
Еще ссылки по теме:
Android SQLite база данных (новичек)
Android SQLite база данных с паролем
Android Android, ListView, база данных SQLite
База SQLite: метод по созданию таблицы не вызывается Android
Android База записей, из которой каждый день нужно брать пару-тройку определенных и показывать на экране

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

Или воспользуйтесь поиском по форуму:
JIyrApy
32 / 32 / 1
Регистрация: 22.08.2010
Сообщений: 244
30.05.2013, 17:37     База SqLite - проверка записей на существование #17
Может быть не то имя столбца? Ну или замените KEY_ID+" = "+9 на "id = "+9
А еще лучше 9 через переменную задать
Yandex
Объявления
30.05.2013, 17:37     База SqLite - проверка записей на существование
Ответ Создать тему
Опции темы

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