2010-06-24 63 views
3

好吧,也許我完全錯過了一些東西,但我剛剛開始使用SQL和Android,並且從我所看到的更新和插入到數據庫需要單獨處理?我可以檢索包含多個記錄的遊標,但是如果我想將更新應用於遊標中的每個記錄,我只能看到如何單獨使用ContentValues和Update(),然後光標需要重裝?Android:插入/更新多個記錄到SQL數據庫

同樣如果我想創建多個新記錄,這些似乎需要單獨插入?我可以不創建列表和批量插入嗎?

對我來說,這似乎是緩慢和繁瑣,而且必須有,我還沒有意識到的東西(尋找答案失敗我......可能是由於使用了不正確的術語是新到Android/JAVA)

下面是我基本上想實現的一個非常簡單的例子,但是必須有更好的方法來實現這個功能。 (我知道在這裏其他一些不好的做法,只是創造一個快速eample)提前

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(); 
     } 
    } 

謝謝,不希望任何人重新寫在右邊的一切,我已經在這裏做了,但是的aPoint方向和鏈接到樣本將不勝感激。

+0

CommonsWare是100%正確的...你可以編寫任何吐出SQL語句的代碼,然後使用SQLiteDatabase.compileStatement('你的語句'),它返回一個SQLiteStatement,然後在其上運行execute()。 – 2010-06-24 17:59:15

回答

2

更新並返回到 數據庫需要單獨處理 ?

INSERT聲明「需要單獨處理」,我能想到的,每一個平臺,我能想到的每個SQL數據庫上。任何支持批量插入模式的東西都是SQL頂層的包裝器。 INSERT這個例外是從另一個表格的SELECT中獲取數據,我不認爲這是你所指的。

UPDATE語句將更新您在WHERE子句中指定的行,它可以是零個,一個或多個。再次,這是SQL的工作方式。

,但如果我想更新每個記錄光標適用於 ,我只能 看到如何單獨做到這一點,利用 ContentValues和更新(),然後 光標需要重裝?

如果變化是一樣的,使用單個UPDATE聲明和適當WHERE條款(無論是通過update()方法,如果適合您的更新模式,或通過execSQL())。您需要requery()Cursor,因爲Cursor在您修改之前保存來自上一個查詢的結果集。

我可以不創建列表和批量 插入嗎?

歡迎您編寫任何您想要的Java代碼。但是,您的約束是SQL/SQLite。