好吧,也许我在这里完全遗漏了一些东西,但我刚刚开始使用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();
}
}
在此先感谢,不要指望任何人重写我在这里所做的一切,但是正确方向的指示和样本的链接将不胜感激。
答案 0 :(得分:2)
在我能想到的每个平台上,更新并插入回 数据库需要处理 单独?
INSERT
语句“需要在我能想到的每个SQL数据库上单独处理”。任何支持批量插入模式的东西都是SQL上的包装器。例外是INSERT
从另一个表中的子SELECT
获取其数据,我认为这不是您所指的。
UPDATE
语句将更新您在WHERE
子句中指定的任何行,可以是零,一个或多个。同样,这是SQL的工作方式。
但如果我想应用更新 光标中的每条记录,我只能 看看如何单独使用 ContentValues和Update(),然后 光标需要重新加载??
如果更改相同,请使用单个UPDATE
语句和相应的WHERE
子句(通过update()
方法,如果符合您的更新模式,或通过{{1 }})。您需要execSQL()
requery()
,因为Cursor
在修改之前保留了上一个查询的结果集。
我是否可以不创建列表和批量 插入
欢迎您编写可满足您需求的Java代码。但是,您的约束是SQL / SQLite。