android как - rawQuery(query, selectionArgs)




добавить готовую (7)

String mQuery = "SELECT Name,Family From tblName";
Cursor mCur = db.rawQuery(mQuery, new String[]{});
mCur.moveToFirst();
while ( !mCur.isAfterLast()) {
        String name= mCur.getString(mCur.getColumnIndex("Name"));
        String family= mCur.getString(mCur.getColumnIndex("Family"));
        mCur.moveToNext();
}

Имя и семья - ваш результат

Я хочу использовать запрос выбора для извлечения данных из таблицы. Я нашел rawQuery(query, selectionArgs) класса SQLiteDatabase для извлечения данных. Но я не знаю, как query и selectionArgs должны быть переданы методу rawQuery ?


Один пример rawQuery - db.rawQuery("select * from table where column = ?",new String[]{"data"});


Для полноты и правильного управления ресурсами:

        ICursor cursor = null;
        try
        {

            cursor = db.RawQuery("SELECT * FROM " + RECORDS_TABLE + " WHERE " + RECORD_ID + "=?", new String[] { id + "" });

            if (cursor.Count > 0)
            {
                cursor.MoveToFirst();
            }
            return GetRecordFromCursor(cursor); // Copy cursor props to custom obj
        }
        finally // IMPORTANT !!! Ensure cursor is not left hanging around ...
        {
            if(cursor != null)
                cursor.Close();
        }

см. ниже код, который может вам помочь.

String q = "SELECT * FROM customer";
Cursor mCursor = mDb.rawQuery(q, null);

или

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

Может быть, это может помочь вам

Cursor c = db.rawQuery("query",null);
int id[] = new int[c.getCount()];
int i = 0;
if (c.getCount() > 0) 
{               
    c.moveToFirst();
    do {
        id[i] = c.getInt(c.getColumnIndex("field_name"));
        i++;
    } while (c.moveToNext());
    c.close();
}

если ваш SQL-запрос - это

SELECT name,roll FROM student WHERE name='Amit' AND roll='7'

то rawQuery будет

String query="SELECT id, name FROM people WHERE name = ? AND roll = ?";
String[] selectionArgs = {"Amit","7"} 
db.rawQuery(query, selectionArgs);

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

Основной ответ.

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

Итак, один вспомогательный экземпляр, одно соединение db. Даже если вы используете его из нескольких потоков, по одному соединению за раз. Объект SqliteDatabase использует блокировки Java для обеспечения доступа к сериализации. Итак, если 100 потоков имеют один экземпляр db, вызовы в фактическую базу данных на диске сериализуются.

Итак, один помощник, одно соединение db, которое сериализовано в Java-коде. Один поток, 1000 потоков, если вы используете один вспомогательный экземпляр, общий между ними, весь ваш код доступа к базе данных является последовательным. И жизнь хороша (иш).

Если вы попытаетесь одновременно записать в базу данных из разных отдельных соединений, произойдет сбой. Он не будет ждать, пока первое не будет сделано, а затем напишет. Он просто не напишет ваши изменения. Хуже того, если вы не вызываете правильную версию вставки / обновления в SQLiteDatabase, вы не получите исключение. Вы просто получите сообщение в своем LogCat, и все будет.

Итак, несколько потоков? Используйте одного помощника. Период. Если вы ЗНАЕТЕ только один поток будет писать, вы МОЖЕТЕ использовать несколько подключений, и ваши чтения будут быстрее, но покупатель остерегается. Я не так много тестировал.

Вот сообщение в блоге с более подробной информацией и примером приложения.

Серый и я на самом деле обертываем инструмент ORM, основанный на его Ormlite, который работает на основе реализаций баз данных Android и следует за безопасной структурой создания / вызова, которую я описываю в сообщении в блоге. Это должно быть очень скоро. Взглянуть.

Между тем, есть последующее сообщение в блоге:

Также проверьте вилку на 2point0 ранее упомянутого примера блокировки:





android sqlite