Подтвердить что ты не робот

Запрос и работа с курсорами в SQLite на Android

Не уверен, что я единственный, кто чувствует это...

Я нахожу работу с sqlite api в андроиде полной болью в прикладе и прекрасной душой. Кто-нибудь получил советы/помощники, чтобы облегчить мне жизнь?

Вот пример того, о чем я говорю.

//create code

db.execSQL("CREATE TABLE " + CUSTOMER_TABLE_NAME + " ("
                        + GENERIC_ID_KEY+ " INTEGER PRIMARY KEY NOT NULL, " 
                        + PHONE_KEY + " INTEGER NOT NULL, "
                        + CUSTOMER_NAME_KEY+ " TEXT NOT NULL, "
                        + EMAIL_KEY + " TEXT NOT NULL, "
                        + ADDRESS_KEY +" TEXT);");


//get code
    Cursor mCursor = mDb.query(true, CUSTOMER_TABLE_NAME, new String[] {GENERIC_ID_KEY,
                        ADDRESS_KEY, PHONE_KEY, EMAIL_KEY,CUSTOMER_NAME_KEY}, GENERIC_ID_KEY + "=" + customerDbId, null,
                                null, null, null, null);

        Customer customer = new Customer (customerDbId, (CharSequence)mCursor.getString(mCursor.getColumnIndexOrThrow(CUSTOMER_NAME_KEY)),
                            (CharSequence)mCursor.getString(mCursor.getColumnIndexOrThrow(PHONE_KEY)),
                            (CharSequence)mCursor.getString(mCursor.getColumnIndexOrThrow(EMAIL_KEY)),
                            (CharSequence)mCursor.getString(mCursor.getColumnIndexOrThrow(ADDRESS_KEY)));

Это простой пример создания простого объекта клиента из запроса db; некоторые из моего кода гораздо более неприятные, чем это. Ручное создание запросов таким образом приводит ко всем ошибкам, которые я не обнаружил до времени выполнения.

Любые советы очень полезны!

Хорошо после приведенных ниже советов, теперь у меня есть это:

  db.execSQL("CREATE TABLE customer (_id INTEGER PRIMARY KEY NOT NULL, " 
                        + "phone_number INTEGER NOT NULL, "
                        + "name TEXT NOT NULL, "
                        + "email TEXT NOT NULL, "
                        + "address TEXT);");


    //get code
String q = "SELECT * FROM customer WHERE _id = " + customerDbId +";"
        Cursor mCursor = mDb.rawQuery(q, null);

        Customer customer = new Customer (mCursor);

в клиенте, я обращаюсь к полям, подобным этому

mName = cursor.getString(2)

Ahh, я чувствую себя намного лучше:)

Приветствия Si

4b9b3361

Ответ 1

  • Не используйте объекты модели, если вам это не нужно. Я пришел к выводу, что если есть значительная бизнес-логика, которая может быть представлена ​​только через объекты модели, что они больше проблем, чем они стоят на мобильной платформе.
  • Предполагая, что вы застряли с объектами модели, попросите их загрузить себя из Cursor, вместо того, чтобы пытаться передать множество параметров.
  • query() является гораздо более подробным, чем rawQuery() для ограниченной добавленной стоимости, если вы знаете SQL.
  • Сборка вашего предложения CREATE TABLE посредством конкатенации - это боль, наложенная на себя, а не мандат SQLite или Android.
  • Не используйте getColumnIndexOrThrow() из пользовательского кода. Вы написали запрос, чтобы вы знали, в каком порядке столбцы возвращаются. Используйте только что-то вроде getColumnIndexOrThrow(), если вы создаете абстрактную библиотеку, которая не знает деталей курсора, которые она дала.
  • String наследуется от CharSequence, поэтому все эти отбрасывания могут быть удалены.

Ответ 2

Я тестировал много своего SQL в SQLite, прежде чем копировать их на Android в виде строк. Мне легче отлаживать, когда я могу напрямую взаимодействовать с командной строкой.

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

Вам также не нужен SQL, такой как INTEGER NOT NULL, поскольку SQLite использует печатание на машинке утиного/манифеста. Это помогает сродство типа, хотя..