2

我有一个表,其中包含设备列表,其中包含类型、制造商和型号等类别以及设备 ID。另一个名为 system 的表使用设备 ID 指向包含设备的表。我有一个编辑系统功能,我正在尝试开始工作,我可以在系统表的记录中编辑设备 ID 字段,以更改设备表中我也指向的设备。我运行更新命令,它看起来应该可以工作,但该行没有得到更新。有谁知道我做错了什么?

这是我的更新代码例程。

SQLiteDatabase db = dbHelper.getWritableDatabase();
String UpdateDeviceName = txtEditDeviceName.getText().toString();
String UpdateDeviceIP = txtEditDeviceIP.getText().toString();
//get the new device id based off of the three spinner values
String dbQuery = "SELECT * FROM " + dbHelper.Devices_Table + ";";
Cursor c = db.rawQuery(dbQuery, null);
if (c.getCount() > 0)
{
    while (c.moveToNext())
    {
        int iColumnID = c.getColumnIndex(dbHelper.Attribute_Device_ID);
        int iColumnDeviceType = c.getColumnIndex(dbHelper.Attribute_Device_Type);
        int iColumnDeviceManufacturer = c.getColumnIndex(dbHelper.Attribute_Device_Manufacturer);
        int iColumnDeviceModel = c.getColumnIndex(dbHelper.Attribute_Device_Model);
        String CheckDeviceType = c.getString(iColumnDeviceType);
        if (CheckDeviceType.equals(DeviceType))
        {
            String CheckDeviceManufacturer = c.getString(iColumnDeviceManufacturer);
            if (CheckDeviceManufacturer.equals(DeviceManufacturer))
            {
                String CheckDeviceModel = c.getString(iColumnDeviceModel);
                if (CheckDeviceModel.equals(DeviceModel))
                {
                    DeviceID = c.getString(iColumnID);
                }
             }
         }
      }
}
db.close();
c.close();
db = dbHelper.getWritableDatabase();
//with the device ID update the system
dbQuery = "UPDATE " + dbHelper.System_Table + " SET " + dbHelper.Attribute_Device_ID + " = " + DeviceID + ", " +
    dbHelper.Attribute_Device_Name + " = '" + UpdateDeviceName + "', " +
    dbHelper.Attribute_Device_IP + " = '" +
    UpdateDeviceIP + "' WHERE " + dbHelper.Attribute_Device_ID + " = " + OrginalDeviceID + ";";
c = db.rawQuery(dbQuery, null);
Log.d("Database Dump", "Edit Device Query: " + dbQuery);
c.close();
db.close();
4

3 回答 3

1

您在搜索后关闭了数据库:

db.close();

省略这一行,因为 DB 帮助程序代码更喜欢保持 DB 处于打开状态,直到不再使用它(使用dbHelper.close()完成后关闭 DB)。

更新后同样适用。

于 2013-01-06T06:29:02.433 回答
1

首先,任何rawQuery语句都不能包含结尾的分号!请参阅 的文档SQLiteDatabase

此外,您始终必须在关闭数据库之前关闭游标。当您为每个查询获得一个新数据库时,您必须关闭数据库。否则系统稍后会抛出异常。虽然这些只会被记录并且不会导致强制关闭,但您仍然应该关心适当的资源管理。

最后,您应该使用该updateWithOnConflict方法而不是使用CONFLICT_REPLACE冲突算法。这只是忽略任何UNIQUE约束并覆盖冲突的行。所以要小心。如果您不想覆盖现有行,则必须确保约束违规不会导致您的问题。

于 2013-01-06T10:24:11.440 回答
1

我找到了答案。首先,我要感谢 Henry 和 Wolfram Rittmeyer。你们非常有帮助。:)

无论出于何种原因,android SQLite 都不喜欢以原始 sql 查询形式使用更新语句。在研究 Wolfram Rittmeyer 所说的关于 updateWithConflict 的内容时,我在我的 dbHelper 扩展的 SQLiteOpenHelper 对象中找到了 update 方法。当我切换到该方法时,我能够更新数据库。我的 where 条件已扩展为包括设备名称,以防系统具有多个相同类型的设备制造商和型号并且只需更改一个。

作为参考,更新数据库的工作代码如下。我只发布代码的更改部分。if (c.getCount() > 0) 块及以上的所有内容均未更改。

c.close();
dbHelper.close();
db = dbHelper.getWritableDatabase();
//with the device ID update the system
ContentValues values = new ContentValues();
values.put(dbHelper.Attribute_Device_ID, DeviceID);
values.put(dbHelper.Attribute_Device_Name, UpdateDeviceName);
values.put(dbHelper.Attribute_Device_IP, UpdateDeviceIP);
String Where = dbHelper.Attribute_Device_ID + " = " + OrginalDeviceID +  " AND " + dbHelper.Attribute_Device_Name + " = '" + OrginalDeviceName + "'";
db.update(dbHelper.System_Table, values, Where, null);
c.close();
dbHelper.close();
finish(); //this exits the activity and goes back to the calling activity
于 2013-01-06T17:16:24.460 回答