У меня есть таблица для хранения контактов. Ниже приведен запрос, который выполняется в 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','');
определить не работает ... также, очевидно, вам следует попробовать использовать SQLiteDatabase.insertWithOnConflict с опцией CONFLICT_REPLACE вместо rawQuery
Заменить val result = db.rawQuery(query, null) на db.execSQL(query)rawQuery используется для выборки строк, а не для выполнения обновления или вставки / удаления.
Также удалите \n из оператора sql. Это не синтаксически неверно (я думаю), но в этом нет необходимости.
Кроме того, поскольку вы используете db.setTransactionSuccessful(), вы также должны использовать в начале db.beginTransaction() и в конце db.endTransaction().
execSQLexecSQL - выполнить один оператор SQL, который НЕ является SELECT / INSERT / UPDATE / DELETE.@Selvin Просто посмотрите еще раз на свой источник. Это тот случай, когда вы читали комментарии к функции ниже?
это те же методы ... во всяком случае ... Выполните один оператор SQL, который НЕ является оператором SELECT или любым другим оператором SQL, возвращающим данные. У него нет средств для возврата каких-либо данных (например, количества затронутых строк). Вместо этого вам рекомендуется использовать insert (String, String, ContentValues), update (String, ContentValues, String, String []) и др., Когда это возможно. ... так что да ... как всегда .. В любом случае я был прав
Угадайте, что ... INSERT возвращает идентификатор строки ... так что очевидно, что это Оператор SQL, возвращающий данные ... поэтому execSQL не следует использовать ... пожалуйста, прочтите документы с пониманием
@Selvin метод db.insert возвращает идентификатор, а не оператор sql INSERT
Большое спасибо. Простая ошибка надолго сбила меня с толку.
какие-нибудь ошибки в логах?