3

さて、おそらく私はここで何かを完全に見逃していますが、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();
        }
    }

事前のおかげで、私がここで行ったすべてを誰かが書き直すことを期待しないでください。しかし、正しい方向に向けて、サンプルへのリンクをいただければ幸いです。

4

1 に答える 1

2

データベースへの更新と挿入は個別に処理する必要がありますか?

INSERT考えられるすべてのSQLデータベース、考えられるすべてのプラットフォームで、ステートメントを「個別に処理する必要があります」。一括挿入パターンをサポートするものはすべて、SQL のラッパーです。例外は、別のテーブルINSERTのサブからデータを取得するSELECTことです。これは、あなたが言及しているものではないと思います。

UPDATEWHEREステートメントは、句で指定した行 (0、1、または多数)を更新します。繰り返しますが、これが SQL の仕組みです。

しかし、カーソル内の各レコードに更新を適用したい場合、ContentValues と Update() を使用して、これを個別に行う方法しかわかりません。その後、カーソルをリロードする必要がありますか??

変更が同じである場合は、単一のUPDATEステートメントと適切なWHERE句を使用しupdate()ます (更新パターンに適合する場合は メソッドを介して、または を介し​​てexecSQL())。は変更前の前のクエリの結果セットを保持するrequery()ためCursor、が必要です。Cursor

リストと一括挿入を作成できませんか?

好きなことをするJavaコードを書いても構いません。ただし、制約は SQL/SQLite です。

于 2010-06-24T10:42:09.653 に答える