2015-08-30 71 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 ); –

    相关问题