Android:将多个记录插入/更新到SQL数据库

时间:2010-06-24 04:56:47

标签: android sql sql-update sql-insert

好吧,也许我在这里完全遗漏了一些东西,但我刚刚开始使用SQL和Android,从我所看到的,更新和插入数据库需要单独处理?

我可以检索包含多个记录的Cursor,但是如果我想对游标中的每个记录应用更新,我只能看到如何使用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 个答案:

答案 0 :(得分:2)

  

更新并插入回   数据库需要处理   单独?

在我能想到的每个平台上,

INSERT语句“需要在我能想到的每个SQL数据库上单独处理”。任何支持批量插入模式的东西都是SQL上的包装器。例外是INSERT从另一个表中的子SELECT获取其数据,我认为这不是您所指的。

UPDATE语句将更新您在WHERE子句中指定的任何行,可以是零,一个或多个。同样,这是SQL的工作方式。

  

但如果我想应用更新   光标中的每条记录,我只能   看看如何单独使用   ContentValues和Update(),然后   光标需要重新加载??

如果更改相同,请使用单个UPDATE语句和相应的WHERE子句(通过update()方法,如果符合您的更新模式,或通过{{1 }})。您需要execSQL() requery(),因为Cursor在修改之前保留了上一个查询的结果集。

  

我是否可以不创建列表和批量   插入

欢迎您编写可满足您需求的Java代码。但是,您的约束是SQL / SQLite。