2015-08-30 70 views
0

我已經做了一個名爲DatabaseHelper.java的單獨的類,並且想製作一個名爲傳感器的簡單表。無法更新我的SQLite數據庫中的現有記錄

我希望用名稱作爲where來更新表格。但我似乎無法讓它工作。請檢查我的代碼:

public class DBHelper extends SQLiteOpenHelper { 
public static final String DATABASE_NAME = "Readings.db"; 
public static final String SENSORS_TABLE_NAME = "sensors"; 
public static final String SENSORS_COLUMN_ID = "Id"; 
public static final String SENSORS_COLUMN_NAME = "Name"; 
public static final String SENSORS_COLUMN_1 = "Reading1"; 
public static final String SENSORS_COLUMN_2 = "Reading2"; 
public static final String SENSORS_COLUMN_3 = "Reading3"; 
public static final String SENSORS_COLUMN_4 = "Reading4"; 
public static final String SENSORS_COLUMN_STATUS = "Status"; 

public DBHelper(Context context){ 
    super(context, DATABASE_NAME, null, 1); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    db.execSQL("CREATE TABLE" + SENSORS_TABLE_NAME + "(" + SENSORS_COLUMN_ID + "INTEGER PRIMARY KEY AUTO INCREMENT," + SENSORS_COLUMN_NAME + "STRING" + 
          SENSORS_COLUMN_1 + "STRING," + SENSORS_COLUMN_2 + "FLOAT," + 
        SENSORS_COLUMN_3 + "FLOAT," + SENSORS_COLUMN_4 + "FLOAT," + SENSORS_COLUMN_STATUS + "BOOLEAN)" 
    ); 
    db.setLocale(Locale.getDefault()); 
    db.setVersion(1); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // TODO Auto-generated method stub 
    db.execSQL("DROP TABLE IF EXISTS" + SENSORS_TABLE_NAME); 
    onCreate(db); 
} 

public boolean insertSensor(String name, boolean status) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put("Name", name); 
    contentValues.put("Reading1", 0); 
    contentValues.put("Reading2", 0); 
    contentValues.put("Reading3", 0); 
    contentValues.put("Reading4", 0); 
    contentValues.put("Status", status); 
    db.insert("sensors", null, contentValues); 
    return true; 
} 

public Cursor getData(String Name){ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery("select * from contacts where Name="+Name+"", null); 
    return res; 
} 

public boolean updateSensor (String Name, float Reading1, float Reading2, float Reading3, float Reading4, boolean Status) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put("Reading1", 0); 
    contentValues.put("Reading2", 0); 
    contentValues.put("Reading3", 0); 
    contentValues.put("Reading4", 0); 
    contentValues.put("Status", Status); 
    db.update("sensors", contentValues, "Name="+Name, new String[]{Name}); 
    return true; 
} 
} 

[編輯]

public boolean updateSensor(String Name, float Reading1, float Reading2, float Reading3, float Reading4, boolean Status) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put("Reading1", Reading1); 
    contentValues.put("Reading2", Reading2); 
    contentValues.put("Reading3", Reading3); 
    contentValues.put("Reading4", Reading4); 
    contentValues.put("Status", Status); 
    db.update("sensors", contentValues, " = ?", new String[]{Name}); 
    return true; 
} 

android.database.sqlite.SQLiteException:鄰近 「=」:語法錯誤(碼1):在編譯:UPDATE傳感器SET Reading3 = ?, Status =?,Reading2 =?,Reading1 = ?, Reading4 =? WHERE =

仍然沒有工作-.-膩

卸載應用程序,並多次重新安裝它。

[編輯]

代碼仍然不工作:

public boolean updateSensor(String Name, float Reading1, float Reading2, float Reading3, float Reading4, boolean Status) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(SENSORS_COLUMN_1, Reading1); 
    contentValues.put(SENSORS_COLUMN_2, Reading2); 
    contentValues.put(SENSORS_COLUMN_3, Reading3); 
    contentValues.put(SENSORS_COLUMN_4, Reading4); 
    contentValues.put(SENSORS_COLUMN_STATUS, Status); 
    db.update("sensors", contentValues, "Name = ?", new String[]{Name}); 
    return true; 
} 

錯誤這個時間是:

android.database.sqlite.SQLiteException:沒有這樣的柱:Reading1(代碼1):,編譯時:UPDATE傳感器SET Reading3 =?,Status =?,Reading2 = ?, Reading1 = ?, Reading4 =? WHERE名稱=?

[編輯]

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    db.execSQL("CREATE TABLE " + SENSORS_TABLE_NAME + "(" + SENSORS_COLUMN_ID + " INTEGER PRIMARY KEY," + SENSORS_COLUMN_NAME + " TEXT" + 
        SENSORS_COLUMN_1 + " REAL," + SENSORS_COLUMN_2 + " REAL," + 
        SENSORS_COLUMN_3 + " REAL," + SENSORS_COLUMN_4 + " REAL," + SENSORS_COLUMN_STATUS + " INTEGER)" 
    ); 
    db.setLocale(Locale.getDefault()); 
    db.setVersion(1); 
} 

回答

1

你的表的創建是錯誤的:如果你陷入困境的空間

db.execSQL("CREATE TABLE" + SENSORS_TABLE_NAME + "(" + SENSORS_COLUMN_ID + "INTEGER PRIMARY KEY AUTO INCREMENT," + SENSORS_COLUMN_NAME + "STRING" + 
         SENSORS_COLUMN_1 + "STRING," + SENSORS_COLUMN_2 + "FLOAT," + 
       SENSORS_COLUMN_3 + "FLOAT," + SENSORS_COLUMN_4 + "FLOAT," + SENSORS_COLUMN_STATUS + "BOOLEAN)" 
); 

而且

一堆
db.execSQL("DROP TABLE IF EXISTS" + SENSORS_TABLE_NAME); 

應該

db.execSQL("CREATE TABLE " + SENSORS_TABLE_NAME + "(" + SENSORS_COLUMN_ID + 
    " INTEGER PRIMARY KEY AUTO INCREMENT," + SENSORS_COLUMN_NAME + " TEXT" + 
    SENSORS_COLUMN_1 + " TEXT," + SENSORS_COLUMN_2 + " FLOAT," + 
    SENSORS_COLUMN_3 + " FLOAT," + SENSORS_COLUMN_4 + " FLOAT," + 
    SENSORS_COLUMN_STATUS + " BOOLEAN)" 
); 

而且

db.execSQL("DROP TABLE IF EXISTS " + SENSORS_TABLE_NAME); 

注意:保持你的代碼格式正確將有很大的幫助。


你也錯過了一些字符串值打交道時:

Cursor res = db.rawQuery("select * from contacts where Name="+Name+"", null); 

而且

db.update("sensors", contentValues, "Name="+Name, new String[]{Name}); 

應該是:

Cursor res = db.rawQuery("select * from contacts where Name='" + Name + "'", null); 

db.update("sensors", contentValues, "Name='" + Name + "'", new String[]{Name}); 

我的建議是使用約束參數(即語法,USUS的佔位符和一個字符串數組來逐個替換它們)。


完成所有代碼修改後,只需卸載並重新安裝應用程序。


[編輯]

你改變了你的代碼(爲什麼?),我的答案無效,因此一半 - 我討厭當這種情況發生!我回到原來的帖子。

好吧,現在看到您的更新代碼...它是錯了

這是正確的語法

update(String table, ContentValues values, String whereClause, String[] whereArgs) 

db.update("sensors", contentValues, DATABASE_NAME + " = ?" + Name, new String[] {Name}); 

應該是

db.update("sensors", contentValues, "Name = ?", new String[]{Name}); 
+0

它幫助,但仍存在更新方法的錯誤。請檢查。 –

+0

現在已經設置更新功能如下: db.update(「sensors」,contentValues,DATABASE_NAME +「=」+ Name,null); –

+0

N.Stein仍然無法正常工作。顯示的錯誤是:android.database.sqlite.SQLiteException:沒有這樣的表:傳感器(代碼1):,編譯時:UPDATE傳感器SET Reading3 =?,Status = ?, Reading2 =?,Reading1 =?,Reading4 =? WHERE Name ='Accelerometer' –

-1

SQLite的使用更一般的動態型系統。請看看必須具有存儲在SQLite數據庫的每個值的存儲類: https://www.sqlite.org/lang.html 1的onCreate

"CREATE TABLE" + SENSORS_TABLE_NAME + "(" + SENSORS_COLUMN_ID + "INTEGER PRIMARY KEY AUTO INCREMENT," +

看看:科瑞表 - >列定義 - >列約束 自動增量只需一個鍵字

SENSORS_COLUMN_NAME + "STRING" + SENSORS_COLUMN_1 + "STRING," +

https://www.sqlite.org/datatype3.html 沒有數據類型STRING也沒有,如果你看一下親和名稱的例子。 獲取文本,或者,如果你wan't給長度,VARCHAR(長度)

SENSORS_COLUMN_2 + "FLOAT," + SENSORS_COLUMN_3 + "FLOAT," + SENSORS_COLUMN_4 + "FLOAT," +

「浮動」 是所有的權利,它轉換爲 「REAL」

SENSORS_COLUMN_STATUS + "BOOLEAN)"

SQLite不有一個單獨的布爾存儲類。相反,布爾值被存儲爲整數0(假)和1(真)。1布爾型數據類型) 我想,你的發言可能是:

db.execSQL("CREATE TABLE" + SENSORS_TABLE_NAME + 
"(" + SENSORS_COLUMN_ID + "INTEGER PRIMARY KEY AUTOINCREMENT," + 
SENSORS_COLUMN_NAME + "TEXT" + 
SENSORS_COLUMN_1 + "TEXT," + 
SENSORS_COLUMN_2 + "FLOAT," + 
SENSORS_COLUMN_3 + "FLOAT," + 
SENSORS_COLUMN_4 + "FLOAT," + 
SENSORS_COLUMN_STATUS + "INTEGER)" 
); 
  • 「setVersion」 和 「的setLocale」 中的onCreate 我不知道這是必要的。 在構造函數中,授予版本1: super(context,DATABASE_NAME,null,1); 請看參考/ android/database/sqlite/SQLiteOpenHelper 更好的辦法是爲這個版本添加一個字符串,因爲當你有一個新版本時會採用一個補丁。

    public static final int DB_VERSION = 1;

  • 而且比:

    super(context, DATABASE_NAME, null, DB_VERSION); 
    
    +0

    您錯過了創建表中的許多空間。除了你所有的改變。它仍然給出了錯誤:android.database.sqlite.SQLiteException:接近「加速度計」:語法錯誤(代碼1):,編譯時:更新傳感器SET Reading3 = ?, Status =?,Reading2 = ?, Reading1 =?,Reading4 =? WHERE Name =?Accelerometer –

    +0

    我在主代碼中使用瞭如下更新方法:db.updateSensor(「Accelerometer」,event.values [0],event.values [1],event.values [2],0,true ); –

    相關問題