Android: вставка / обновление нескольких записей в базе данных SQL - PullRequest
3 голосов
/ 24 июня 2010

Хорошо, так что, возможно, я чего-то здесь упускаю, но я только начал работать с SQL и Android, и, насколько я вижу, обновления и вставки обратно в базу данных должны обрабатываться индивидуально?

Я могу получить Курсор, содержащий несколько записей, но если я хочу применить обновление к каждой записи в курсоре, я могу только увидеть, как это сделать по отдельности, используя ContentValues ​​и Update (), и тогда курсор требует перезагрузки??

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

Мне это кажется медленным и громоздким, и должно быть что-то, о чем я еще не знаю (поиск ответов мне не удался ... скорее всего из-заиспользуя неправильные термины, являющиеся новыми для android / java)

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

public class HelloSQL extends Activity {

    SQLiteDatabase myDB = null;
    String TableName = "myTable";
    ContentValues myVals = new ContentValues();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String Data = "";

        // Create a Database.
        try {
            myDB = this.openOrCreateDatabase("myTestDB", MODE_PRIVATE, null);

            // Create a Table in the Database.
            myDB.execSQL("CREATE TABLE IF NOT EXISTS " + TableName
                    + " ( id INTEGER PRIMARY KEY AUTOINCREMENT,"
                    + " Value1 INTEGER, Value2 INTEGER);");

            myDB.execSQL("DELETE FROM " + TableName);

            // insert value1
            for (int i = 0; i < 100; i++) {
                myVals.put("Value1", i);
                myDB.insert(TableName, null, myVals);
            }

            // retrieve data from database
            Cursor c = myDB.rawQuery("SELECT * FROM " + TableName, null);

            int colId = c.getColumnIndex("id");
            int col1 = c.getColumnIndex("Value1");
            int col2 = c.getColumnIndex("Value2");
            Random generator = new Random();

            // Loop through all values and update value2
            c.moveToFirst();
            if (c != null) {                
                do {                    
                    long id = c.getLong(colId);
                    int val1 = c.getInt(col1);
                    int randomVal = generator.nextInt(99);
                    myVals.put("Value1", val1);
                    myVals.put("Value2", randomVal);
                    myDB.insert(TableName, null, myVals);
                    myDB.update(TableName, myVals, "id=?",new String[] {Long.toString(id)});
                } while (c.moveToNext());
            }

            // requery data
            c = myDB.rawQuery("SELECT * FROM " + TableName, null);

            // display all values
            c.moveToFirst();
            if (c != null) {
                do {
                    int val1 = c.getInt(col1);
                    int val2 = c.getInt(col2);
                    Data = Data + Integer.toString(val1) + " " + Integer.toString(val2)  + "\n";
                } while (c.moveToNext());
            }           


            TextView tv = new TextView(this);
            tv.setText(Data);
            setContentView(tv);

        } catch (Exception e) {
            Log.e("Error", "Error", e);
        } finally {
            if (myDB != null)
                myDB.close();
        }
    }

Заранее спасибо, не ожидайте, что кто-то переписывает все, что я здесь сделал, но вправильное направление и ссылки на образец будет принята с благодарностью.

1 Ответ

2 голосов
/ 24 июня 2010

обновляет и вставляет обратно в база данных должна быть обработана индивидуально

INSERT операторы «должны обрабатываться индивидуально» для каждой базы данных SQL, о которой я могу думать, на каждой платформе, о которой я могу думать. Все, что поддерживает шаблон массовой вставки, является оболочкой поверх SQL. Исключение составляет INSERT, получающий свои данные из подпункта SELECT из другой таблицы, о котором я не думаю, что вы имеете в виду.

UPDATE операторы будут обновлять любые строки, которые вы указали в предложении WHERE, которые могут быть ноль, один или много. Опять же, так работает SQL.

но если я хочу применить обновление к каждая запись в курсоре, я могу только посмотрим, как это сделать индивидуально, используя ContentValues ​​и Update (), а затем курсор требует перезагрузки ??

Если изменение такое же, используйте один оператор UPDATE и соответствующее предложение WHERE (либо с помощью метода update(), если это соответствует вашему шаблону обновления, либо с помощью execSQL()). Вам нужно requery() Cursor, потому что Cursor содержит набор результатов предыдущего запроса до ваших изменений.

Могу ли я не создавать список и объем? вставить?

Вы можете писать код Java, который делает все, что вы хотите. Однако ваше ограничение - SQL / SQLite.

...