ВСТАВИТЬ ИЛИ ЗАМЕНИТЬ на SQLite не работает

У меня есть таблица для хранения контактов. Ниже приведен запрос, который выполняется в onCreate. Эти запросы дают ожидаемый результат в sqliteonline.com. Я не знаю, что здесь не так.

CREATE TABLE Contacts (rowId INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(256),mobile VARCHAR(30) UNIQUE,email VARCHAR(64))

Используя этот код, я читаю контакт.

    val phones = activity.contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null)
                while (phones.moveToNext()) {
                    val name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))
                    var phone = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
                    val contact = Contact()
                    contact.name = name
                    contact.mobile = phone

                    val query = "INSERT OR REPLACE INTO $TABLE_NAME ($COL_NAME, $COL_MOBILE, $COL_EMAIL) \n" +
                            "  VALUES ('${contact.name}','${contact.mobile}','${contact.email}');"
                    val result = db.rawQuery(query, null)
                    Log.d("ContactManager" , "Query : $query")
                    result.close()
                }
                db.setTransactionSuccessful()
                phones.close()

Я даже пробовал это вместо запроса (это тоже не работает)

            val query = "INSERT OR REPLACE INTO $TABLE_NAME ($COL_ID,$COL_NAME, $COL_MOBILE, $COL_EMAIL) \n" +
                    "  VALUES ((select $COL_ID from $TABLE_NAME where $COL_MOBILE = '${contact.mobile}'),'${contact.name}','${contact.mobile}','${contact.email}');"

Эти запросы выполняются при вставке или обновлении.

INSERT OR REPLACE INTO Contacts (name, mobile, email) VALUES ('Police','100','');
INSERT OR REPLACE INTO Contacts (name, mobile, email) VALUES ('Balance Info','111','');
INSERT OR REPLACE INTO Contacts (name, mobile, email) VALUES ('Distress Number','112','');
INSERT OR REPLACE INTO Contacts (name, mobile, email) VALUES ('Distress Number','112','');
INSERT OR REPLACE INTO Contacts (name, mobile, email) VALUES ('Customer Care','121','');

какие-нибудь ошибки в логах?

Vivek Mishra 20.08.2018 11:01

определить не работает ... также, очевидно, вам следует попробовать использовать SQLiteDatabase.insertWithOnConflict с опцией CONFLICT_REPLACE вместо rawQuery

Selvin 20.08.2018 11:57
1
2
103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Заменить val result = db.rawQuery(query, null) на db.execSQL(query)
rawQuery используется для выборки строк, а не для выполнения обновления или вставки / удаления.
Также удалите \n из оператора sql. Это не синтаксически неверно (я думаю), но в этом нет необходимости.
Кроме того, поскольку вы используете db.setTransactionSuccessful(), вы также должны использовать в начале db.beginTransaction() и в конце db.endTransaction().

rawQuery используется для выборки строк, а не для выполнения обновления или вставки / удаления ... то же, что и execSQLexecSQL - выполнить один оператор SQL, который НЕ является SELECT / INSERT / UPDATE / DELETE.
Selvin 20.08.2018 11:37

@Selvin Просто посмотрите еще раз на свой источник. Это тот случай, когда вы читали комментарии к функции ниже?

user8959091 20.08.2018 11:39

это те же методы ... во всяком случае ... Выполните один оператор SQL, который НЕ является оператором SELECT или любым другим оператором SQL, возвращающим данные. У него нет средств для возврата каких-либо данных (например, количества затронутых строк). Вместо этого вам рекомендуется использовать insert (String, String, ContentValues), update (String, ContentValues, String, String []) и др., Когда это возможно. ... так что да ... как всегда .. В любом случае я был прав

Selvin 20.08.2018 11:43

Угадайте, что ... INSERT возвращает идентификатор строки ... так что очевидно, что это Оператор SQL, возвращающий данные ... поэтому execSQL не следует использовать ... пожалуйста, прочтите документы с пониманием

Selvin 20.08.2018 11:48

@Selvin метод db.insert возвращает идентификатор, а не оператор sql INSERT

user8959091 20.08.2018 11:49

Большое спасибо. Простая ошибка надолго сбила меня с толку.

Sidd 20.08.2018 12:06

Другие вопросы по теме