无法在我的SQLiteDatabase更新现有记录我的、SQLiteDatabase

2023-09-03 21:32:56 作者:일몰입(敷衍)

我做了一个名为DatabaseHelper.java一个单独的类,并希望做一个简单的表名为传感器。

我想用的名字作为在哪里更新表。但我似乎无法使它发挥作用。请检查我的code:

 公共类DBHelper扩展SQLiteOpenHelper {
公共静态最后弦乐DATABASE_NAME =Readings.db;
公共静态最后弦乐SENSORS_TABLE_NAME =传感器;
公共静态最后弦乐SENSORS_COLUMN_ID =ID;
公共静态最后弦乐SENSORS_COLUMN_NAME =名称;
公共静态最后弦乐SENSORS_COLUMN_1 =Reading1;
公共静态最后弦乐SENSORS_COLUMN_2 =Reading2;
公共静态最后弦乐SENSORS_COLUMN_3 =Reading3;
公共静态最后弦乐SENSORS_COLUMN_4 =Reading4;
公共静态最后弦乐SENSORS_COLUMN_STATUS =状态;

公共DBHelper(上下文的背景下){
    超级(上下文,DATABASE_NAME,空,1);
}

@覆盖
公共无效的onCreate(SQLiteDatabase DB){
    // TODO自动生成方法存根
    db.execSQL(CREATE TABLE+ SENSORS_TABLE_NAME +(+ SENSORS_COLUMN_ID +INTEGER PRIMARY KEY自动递增,+ SENSORS_COLUMN_NAME +STRING+
                            SENSORS_COLUMN_1 +的字符串,+ SENSORS_COLUMN_2 +FLOAT,+
                    SENSORS_COLUMN_3 +FLOAT,+ SENSORS_COLUMN_4 +FLOAT,+ SENSORS_COLUMN_STATUS +布尔型)
    );
    db.setLocale(Locale.getDefault());
    db.setVersion(1);
}

@覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
    // TODO自动生成方法存根
    db.execSQL(DROP TABLE IF EXISTS+ SENSORS_TABLE_NAME);
    的onCreate(DB);
}

公共布尔insertSensor(字符串名称,布尔状态)
{
    SQLiteDatabase DB = this.getWritableDatabase();
    ContentValues​​ contentValues​​ =新ContentValues​​();
    contentValues​​.put(姓名,姓名);
    contentValues​​.put(Reading1,0);
    contentValues​​.put(Reading2,0);
    contentValues​​.put(Reading3,0);
    contentValues​​.put(Reading4,0);
    contentValues​​.put(状态,状态);
    db.insert(传感器,空,contentValues​​);
    返回true;
}

公共光标的getData(字符串名称){
    SQLiteDatabase DB = this.getReadableDatabase();
    光标解析度= db.rawQuery(选择*从联系人,其中名称=+姓名+,NULL);
    返回水库;
}

公共布尔updateSensor(字符串名称,浮Reading1,浮Reading2,浮Reading3,浮Reading4,布尔状态)
{
    SQLiteDatabase DB = this.getWritableDatabase();
    ContentValues​​ contentValues​​ =新ContentValues​​();
    contentValues​​.put(Reading1,0);
    contentValues​​.put(Reading2,0);
    contentValues​​.put(Reading3,0);
    contentValues​​.put(Reading4,0);
    contentValues​​.put(状态,状态);
    db.update(传感器,contentValues​​,NAME =+姓名,新的String [] {名});
    返回true;
}
}
 

 公共布尔updateSensor(字符串名称,浮Reading1,浮Reading2,浮Reading3,浮Reading4,布尔状态){
    SQLiteDatabase DB = this.getWritableDatabase();
    ContentValues​​ contentValues​​ =新ContentValues​​();
    contentValues​​.put(Reading1,Reading1);
    contentValues​​.put(Reading2,Reading2);
    contentValues​​.put(Reading3,Reading3);
    contentValues​​.put(Reading4,Reading4);
    contentValues​​.put(状态,状态);
    db.update(传感器,contentValues​​,=?,新的String [] {名});
    返回true;
}
 

android.database.sqlite.SQLiteException:近=:语法错误(code 1):在编制:更新传感器SET Reading3 = ?,状态= ?, Reading2 = ?, Reading1 = ?, Reading4 =? WHERE =

仍然没有工作-.-觉得累

卸载应用程序,并重新安装它多次。

code仍然没有工作:

 公共布尔updateSensor(字符串名称,浮Reading1,浮Reading2,浮Reading3,浮Reading4,布尔状态){
    SQLiteDatabase DB = this.getWritableDatabase();
    ContentValues​​ contentValues​​ =新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,状态);
    db.update(传感器,contentValues​​,NAME =?,新的String [] {名});
    返回true;
}
 
Android中SQLite数据库操作 创建 增加 更新 查询数据库

该错误这段时间是:

android.database.sqlite.SQLiteException:没有这样的列:Reading1(code 1):在编制:更新传感器SET Reading3 = ?,状态= ?, Reading2 = ?, Reading1 = ?, Reading4 =?其中name =?

  @覆盖
公共无效的onCreate(SQLiteDatabase DB){
    // TODO自动生成方法存根
    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);
}
 

解决方案

您表的创建是错误的:你惹了一堆空格

  db.execSQL(CREATE TABLE+ SENSORS_TABLE_NAME +(+ SENSORS_COLUMN_ID +INTEGER PRIMARY KEY自动递增,+ SENSORS_COLUMN_NAME +STRING+
                        SENSORS_COLUMN_1 +的字符串,+ SENSORS_COLUMN_2 +FLOAT,+
                SENSORS_COLUMN_3 +FLOAT,+ SENSORS_COLUMN_4 +FLOAT,+ SENSORS_COLUMN_STATUS +布尔型)
);
 

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

  db.execSQL(CREATE TABLE+ SENSORS_TABLE_NAME +(+ SENSORS_COLUMN_ID +
    INTEGER PRIMARY KEY自动递增,+ SENSORS_COLUMN_NAME +TEXT+
    SENSORS_COLUMN_1 +TEXT+ SENSORS_COLUMN_2 +FLOAT,+
    SENSORS_COLUMN_3 +FLOAT,+ SENSORS_COLUMN_4 +FLOAT,+
    SENSORS_COLUMN_STATUS +布尔型)
);
 

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

请注意:保持你的code格式正确将有很大的帮助。

您也错过了一些 时字符串值处理:

 光标RES = db.rawQuery(选择*从联系人,其中名称=+姓名+,NULL);
 

  db.update(传感器,contentValues​​,NAME =+姓名,新的String [] {名});
 

应该是:

 光标RES = db.rawQuery(选择*从联系人,其中名称='+姓名+',NULL);
 

  db.update(传感器,contentValues​​,NAME ='+姓名+',新的String [] {名});
 

我的建议是使用绑定参数(即语法,USUS在?占位符和一个String数组,以取代他们一个接一个)。

使得所有code修改后,只需卸载并重新安装应用程序。

您改变了您的code(为什么?!),我的回答的,因此无效一半 - 我讨厌当这种情况发生!我滚回到原来的岗位。

好了,现在看到你更新code ......它的错误!

这是正确的语法

 更新(字符串表,ContentValues​​值,字符串whereClause,字符串[] whereArgs)
 

  db.update(传感器,contentValues​​,DATABASE_NAME +=+姓名,新的String [] {名});
 

  db.update(传感器,contentValues​​,NAME =?,新的String [] {名});
 

I have made a separate class named DatabaseHelper.java and want to make a simple table named sensors.

I wish to update the table using name as a where. But I can't seem to make it work. Please check my code:

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

[EDIT]

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: near "=": syntax error (code 1): , while compiling: UPDATE sensors SET Reading3=?,Status=?,Reading2=?,Reading1=?,Reading4=? WHERE =

Still not working -.- getting tired

Uninstalled the app and reinstalled it multiple times.

[EDIT]

Code still not working:

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

The error this time is:

android.database.sqlite.SQLiteException: no such column: Reading1 (code 1): , while compiling: UPDATE sensors SET Reading3=?,Status=?,Reading2=?,Reading1=?,Reading4=? WHERE Name = ?

[EDIT]

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

解决方案

Your table creation is wrong: you mess a bunch of spaces

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)"
);

And

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

Should be

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)"
);

And

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

Note: Keeping your code well formatted would help a lot.

You also miss some ' when dealing with string values:

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

And

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

Should be:

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

And

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

My advice would be to use bound parameters (that syntax which usus the ? placeholders and a String array to replace them one by one).

After making all the code modifications, just uninstall and reinstall the app.

[EDIT]

You changed your code (why?!), therefore invalidating half of my answer - I hate when this happens!! I rolled back to your original post.

OK, now seeing your update code... it's wrong!

This is the correct syntax

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

This

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

should be

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