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

标签 android sql sql-update sql-insert

好吧,也许我在这里完全遗漏了一些东西,但我刚刚开始使用 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();
        }
    }

提前致谢,不要指望任何人重写我在这里所做的一切,但非常感谢指出正确的方向和指向示例的链接。

最佳答案

updates and inserts back to the database need to be handled individually?

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

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

but if I wanted to apply an update to each record in the cursor, I can only see how to do this individually, using ContentValues and Update(), and then the cursor requires reloading??

如果更改相同,则使用单个 UPDATE 语句和适当的 WHERE 子句(通过 update() 方法,如果适合您的更新模式,或通过 execSQL())。您需要 requery() Cursor,因为 Cursor 保存您修改之前上一个查询的结果集。

Can I not create a List and bulk insert?

欢迎您编写随心所欲的 Java 代码。但是,您的约束是 SQL/SQLite。

关于Android:将多条记录插入/更新到 SQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3107327/

相关文章:

java - SQL : Vehicule gets added to DataBase but not his options

sql - 如何将文本添加到 SQL 列

mysql - SQL 从另一个表中的另一列更新一列

php - 流行的 Android 应用程序如何连接到服务器?

java - 无法使用首选项编辑器在单独的类中创建 AlertDialog

android - @Parcelize 和枚举类 - 重载解析歧义

java - Firebase onDataChange - 空对象引用

sql - 防止 MS-SQL 表中的循环引用

php - 需要在 Bootstrap 中使用模式编辑表格的一行

java - 更新mysql数据库中的数据时需要一些建议