2011-07-20 114 views
2

我想研究並做一個簡單的數據庫,只創建一個表只有一行。我首先看到它在我使用SQLiteHelper的'update()'方法時起作用。但是,當我嘗試使用SQL命令'UPDATE ... SET'時,它會拋出'沒有這樣的列'的錯誤Android:SQLiteDatabase - 沒有這樣的列

我不知道爲什麼我不能使用'UPDATE ... SET'命令'更新'方法沒有問題。如果有人知道android SQL很好,你能幫我嗎?以下是我的代碼和錯誤消息。

CODE:

public class TestDBMain extends Activity { 
private final String SETTINGS_TABLE_NAME = "settings"; 

// Columns 
private final String DEV_ID = "dev_id"; 
private final String SERVER_NAME = "server_name"; 
private final String SERVER_PORT = "server_port"; 
private final String SERVER_SUBFOLDER = "server_subfolder"; 
private final String USERNAME = "username"; 
private final String PASSWORD = "password"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    DB_Settings db_s = new DB_Settings(this); 
    db_s.deleteDBSettings(); 
    db_s.addDBSettings(SERVER_NAME, "test_server_01"); 
    // ERROR occurs here 
    db_s.addDBSettingsWithSQLCommand(SERVER_NAME, "test_server_22"); 
} 

public class DB_Settings extends SQLiteOpenHelper { 
    private static final String DB_NAME = "settings.db"; 
    private static final int DATABASE_VERSION = 1; 
    private String[] Settings_FROM = { _ID, DEV_ID, SERVER_NAME, SERVER_PORT, SERVER_SUBFOLDER, 
      USERNAME, PASSWORD}; 

    private Context mContext; 

    public DB_Settings(Context context) { 
     super(context, DB_NAME, null, DATABASE_VERSION); 
     mContext = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE IF NOT EXISTS "+SETTINGS_TABLE_NAME+"("+_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, " 
       +DEV_ID+" VARCHAR," 
       +SERVER_NAME+" VARCHAR," 
       +SERVER_PORT+" INTEGER," 
       +SERVER_SUBFOLDER+" VARCHAR," 
       +USERNAME+" VARCHAR," 
       +PASSWORD+" VARCHAR);");   

     initialize(db); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 

    public void deleteDBSettings(){ 
     mContext.deleteDatabase(DB_NAME); 
    } 

    private void initialize(SQLiteDatabase db){ 
     ContentValues values = new ContentValues(); 

     values.put(DEV_ID, "1"); 
     values.put(SERVER_NAME, "1"); 
     values.put(SERVER_PORT, 443); 
     values.put(SERVER_SUBFOLDER, "1"); 
     values.put(USERNAME, "1"); 
     values.put(PASSWORD, "1"); 

     db.insertOrThrow(SETTINGS_TABLE_NAME, null, values); 
    } 

    public void addDBSettings(String key, Object value){ 
     // Insert a new record 
     SQLiteDatabase db = getWritableDatabase(); 
     ContentValues table_value = new ContentValues(); 

     if(value.getClass().equals(String.class)){ 
      table_value.put(key, value.toString()); 
     } 
     else if (value.getClass().equals(Integer.class)){ 
      table_value.put(key, (Integer)value); 
     } 

     // add to database 
     db.update(SETTINGS_TABLE_NAME, table_value, "_id=1", null); 
    } 

    public void addDBSettingsWithSQLCommand(String key, Object value){ 
     SQLiteDatabase db = getWritableDatabase(); 
     db.execSQL("UPDATE "+SETTINGS_TABLE_NAME 
       +" set "+key+" = "+value.toString() 
       +" where _id = 1;"); 
    } 
} 

錯誤日誌:

07-20 01:00:53.516: ERROR/AndroidRuntime(6066): Caused by: android.database.sqlite.SQLiteException: no such column: test_server_22: UPDATE settings set server_name = test_server_22 where _id = 1; 
07-20 01:00:53.516: ERROR/AndroidRuntime(6066):  at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method) 
07-20 01:00:53.516: ERROR/AndroidRuntime(6066):  at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1727) 
07-20 01:00:53.516: ERROR/AndroidRuntime(6066):  at android.test.db.TestDBMain$DB_Settings.addDBSettingsWithSQLCommand(TestDBMain.java:109) 
07-20 01:00:53.516: ERROR/AndroidRuntime(6066):  at android.test.db.TestDBMain.onCreate(TestDBMain.java:35) 
07-20 01:00:53.516: ERROR/AndroidRuntime(6066):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-20 01:00:53.516: ERROR/AndroidRuntime(6066):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 

回答

1

嘗試此查詢更新..

db.execSQL("UPDATE "+SETTINGS_TABLE_NAME 
       +" set "+key+" = \""+value.toString() 
       +"\" where _id = 1;"); 
+0

很高興再次見到你,CapDroid。有效!如果你不介意,你會教我怎樣才能解決這個問題? – June

+0

實際上它的值必須是雙倒數的,我們不能直接在java中使用它(「),所以在它之前需要斜槓(\)(」)我希望你得到所有的.. –

+0

謝謝你的其他幫助,CapDroid!我學到了很多! – June

4

對於查詢字符串,你必須把'和'。試試這個

db.execSQL("UPDATE "+SETTINGS_TABLE_NAME 
       +" set "+key+" = '"+value.toString() 
       +"' where _id = 1;"); 
+0

這個也可以工作!感謝您的回答和解答。由於Capdroid幫助我,我會先選擇他的答案,但給你的答案+1投票。謝謝! – June

+0

+1投給我... –

+0

感謝你倆 – Rasel