Попытка преобразовать существующую базу данных SQLite для использования с ОС Android - PullRequest
0 голосов
/ 03 апреля 2011

Эй, ребята, у меня есть уже существующая база данных SQLite, которую я хочу использовать с моим приложением для Android.Я создал образец базы данных с нуля для целей тестирования, где каждый первичный ключ называется _id, а также добавляю таблицу android_metadata.Это прекрасно работает.

Так что теперь, когда я попытался переименовать первичные ключи базы данных, которые у меня уже есть, и загрузить их в приложение, это не работает.

Может кто-нибудь сказать мне, что именно я должен сделать с моей существующей базой данных, чтобы она работала с ОС Android?Например, что именно должно быть изменено в базе данных, чтобы оно работало?

И да, я просмотрел большинство учебных пособий, но большинство из них не содержат подробностей о том, что вы должны изменить в существующей базе данных.

Вот база данных, которую яиспользую: http://www.mediafire.com/file/bpbpm19y6kbpjot/database.db

Спасибо.

Ответы [ 4 ]

1 голос
/ 21 апреля 2011

Опять же, я нашел этот документ очень полезным: http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

0 голосов
/ 03 апреля 2011

На самом деле вам не нужно, чтобы основной столбец ID назывался _id - вы можете просто использовать что-то вроде SELECT my_id as _id, another_field ... в своем операторе select.

И вы можете сделать то, что сказал Omokoii вышеи установите флаг NO_LOCALIZED_COLLATORS, или вы можете создать таблицу android_metadata и вставить в нее значение en-US.

Что касается использования существующей БД, возможно, этот пост в блоге может помочь: http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

0 голосов
/ 03 апреля 2011

Убедитесь, что ваша существующая база данных SQLite объявляет целочисленные первичные ключи, используя только «INTEGER» (дословно), а не «int» или «int16», или любые другие возможности для объявления целого числа, которое распознает SQLite.

Я столкнулся с сопутствующей проблемой при импорте базы данных SQLite в Adobe AIR (которая имеет общую кодовую базу с Goodle и Mozilla и другими членами консорциума, IIRC). Мой PK был определен как "int" (дословно). SQLite обрабатывает первичные ключи «INTEGER» иначе, чем первичные ключи «int», «INT» или «int16» и т. Д.

Документировано здесь: http://www.sqlite.org/datatypes.html

Первичный ключ INTEGER обрабатывается SQLite как синоним для RowId. Любой другой тип типа int аналогичен стандартному столбцу, и для стандартного столбца RowId не обязательно будет равен значению в столбце PK.

Однако Adobe и другая связанная подгруппа членов консорциума SQLite не реализовали это (документированное) поведение - для них любой / каждый целочисленный тип, используемый в качестве столбца PK, рассматривается как синоним для row id--, и их неспособность реализовать это различие может привести к ошибочным соединениям, когда в их реализацию импортируется существующая база данных SQLite, если существующая база данных использовала что-то отличное от «INTEGER» при объявлении своего целочисленного значения. введите первичные ключи.

P.S. Я обратил на это внимание Adobe и обсудил это ad nauseam в списке рассылки SQLite и на форуме Adobe AIR. Adobe написала мне, что они документируют свое отклонение от «стандартного» поведения SQLite, но оставляют все как есть, поэтому я считаю, что Android также будет отличаться от документированного поведения SQLite в этом отношении.

P.P.S. Похоже, что эта подгруппа членов консорциума либо не представляла возможность импорта базы данных (то есть они предполагали, что база данных будет всегда создаваться заново через их интерфейс), либо просто игнорировала это (по общему признанию странное) исключительное поведение в SQLite.

P.P.P.S. Эта таблица, например, из базы данных, которую использует OP, будет возвращать ложные результаты, когда участвует в соединениях в столбце [stop_id], если она прикреплена реализацией SQLite, которая не реализует «стандартный» исключительный INTEGER / int (et al) поведение, но обрабатывает любой / каждый тип int при использовании с PK в качестве синонима для rowid:

  CREATE TABLE mt_stop (
    stop_id  int  NOT NULL PRIMARY KEY ASC,
    stop_lat real NOT NULL CHECK (stop_lat >= -90 AND stop_lat <= 90),
    stop_lon real NOT NULL CHECK (stop_lon >= -180 AND stop_lon <= 180),
    stop_name varchar (120) DEFAULT 'Unknown'
)
0 голосов
/ 03 апреля 2011

Я обычно устанавливаю флаг NO_LOCALIZED_COLLATORS при вызове SQLiteDatabase.openDatabase ().Тогда вам не нужна таблица android_metadata.Насколько я знаю, столбец _id также должен иметь тип INTEGER PRIMARY KEY AUTOINCREMENT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...