我现在已经收到这个错误两天了,我的代码无法找到问题。
这是数据库代码。
SQLHandler.java
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class SQLHandler {
public static final String KEY_ROOMMOVEHOLDER = "roommoveholder";
public static final String KEY_ROOM = "room";
public static final String KEY_ITEMMOVEHOLDER = "itemmoveholder";
public static final String KEY_ITEMNAME = "itemname";
public static final String KEY_ITEMVALUE = "itemvalue";
public static final String KEY_ROOMHOLDER = "roomholder";
public static final String KEY_MOVENAME = "movename";
public static final String KEY_ID1 = "_id";
public static final String KEY_ID2 = "_id";
public static final String KEY_ID3 = "_id";
public static final String KEY_ID4 = "_id";
public static final String KEY_MOVEDATE = "movedate";
private static final String DATABASE_NAME = "mymovingfriend";
private static final int DATABASE_VERSION = 1;
public static final String KEY_TODOMOVE = "todomove";
public static final String KEY_SORTANDPURGE = "sortandpurge";
public static final String KEY_RESEARCH = "research";
public static final String KEY_CREATEMOVINGBINDER = "createmovingbinder";
public static final String KEY_ORDERSUPPLIES = "ordersupplies";
public static final String KEY_USEITORLOSEIT = "useitorloseit";
public static final String KEY_TAKEMEASUREMENTS = "takemeasurements";
public static final String KEY_CHOOSEMOVER = "choosemover";
public static final String KEY_BEGINPACKING = "beginpacking";
public static final String KEY_LABEL = "label";
public static final String KEY_SEPARATEVALUES = "separatevalues";
public static final String KEY_DOACHANGEOFADDRESS = "doachangeofaddress";
public static final String KEY_NOTIFYIMPORTANTPARTIES = "notifyimportantparties";
private static final String DATABASE_TABLE1 = "movingname";
private static final String DATABASE_TABLE2 = "movingrooms";
private static final String DATABASE_TABLE3 = "movingitems";
private static final String DATABASE_TABLE4 = "todolist";
public static final String CREATE_TABLE_1 = "CREATE TABLE " + DATABASE_TABLE1 + " (" +
KEY_ID1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_MOVEDATE + " TEXT NOT NULL, " +
KEY_MOVENAME + " TEXT NOT NULL);";
public static final String CREATE_TABLE_2 = "CREATE TABLE " + DATABASE_TABLE2 + " (" +
KEY_ID2 + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_ROOMMOVEHOLDER + " TEXT NOT NULL , " +
KEY_ROOM + " TEXT NOT NULL);";
public static final String CREATE_TABLE_3 = "CREATE TABLE " + DATABASE_TABLE3 + " (" +
KEY_ID3 + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_ITEMNAME + " TEXT NOT NULL, " +
KEY_ITEMVALUE + " TEXT NOT NULL, " +
KEY_ROOMHOLDER + " TEXT NOT NULL, " +
KEY_ITEMMOVEHOLDER + " TEXT NOT NULL);";
public static final String CREATE_TABLE_4 = "CREATE TABLE " + DATABASE_TABLE4 + " (" +
KEY_ID4 + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_TODOMOVE + " TEXT NOT NULL, " +
KEY_SORTANDPURGE + " TEXT NOT NULL, " +
KEY_RESEARCH + " INTEGER NOT NULL, " +
KEY_CREATEMOVINGBINDER + " TEXT NOT NULL, " +
KEY_ORDERSUPPLIES + " TEXT NOT NULL, " +
KEY_USEITORLOSEIT + " TEXT NOT NULL, " +
KEY_TAKEMEASUREMENTS + " TEXT NOT NULL, " +
KEY_CHOOSEMOVER + " TEXT NOT NULL, " +
KEY_BEGINPACKING + " TEXT NOT NULL, " +
KEY_LABEL + " TEXT NOT NULL, " +
KEY_SEPARATEVALUES + " TEXT NOT NULL, " +
KEY_DOACHANGEOFADDRESS + " TEXT NOT NULL, " +
KEY_NOTIFYIMPORTANTPARTIES + " TEXT NOT NULL);";
private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;
private static class DbHelper extends SQLiteOpenHelper{
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREATE_TABLE_1);
db.execSQL(CREATE_TABLE_2);
db.execSQL(CREATE_TABLE_3);
db.execSQL(CREATE_TABLE_4);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE1);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE2);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE3);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE4);
onCreate(db);
}
}
public SQLHandler(Context c){
ourContext = c;
}
public SQLHandler open() throws SQLException{
ourHelper = new DbHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;
}
public void close(){
ourHelper.close();
}
public long createMove(String smovename){
ContentValues cv = new ContentValues();
cv.put(KEY_MOVENAME, smovename);
cv.put(KEY_MOVEDATE, "Not yet set");
return ourDatabase.insert(DATABASE_TABLE1, null, cv);
}
public long addRooms(String sroommoveholder, String sroom){
ContentValues cv = new ContentValues();
cv.put(KEY_ROOMMOVEHOLDER, sroommoveholder);
cv.put(KEY_ROOM, sroom);
return ourDatabase.insert(DATABASE_TABLE2, null, cv);
}
public long addItems(String sitemmoveholder, String sroomholder, String sitemname, String sitemvalue){
ContentValues cv = new ContentValues();
cv.put(KEY_ITEMMOVEHOLDER, sitemmoveholder);
cv.put(KEY_ROOMHOLDER, sroomholder);
cv.put(KEY_ITEMNAME, sitemname);
cv.put(KEY_ITEMVALUE, sitemvalue);
return ourDatabase.insert(DATABASE_TABLE3, null, cv);
}
public long todoList(String todoitem){
ContentValues cv = new ContentValues();
cv.put(todoitem, "Done");
return ourDatabase.insert(DATABASE_TABLE4, null, cv);
}
public Cursor getMove(){
String[] columns = new String[]{KEY_ID1, KEY_MOVENAME};
Cursor cursor = ourDatabase.query(DATABASE_TABLE1, columns, null, null, null, null, null);
return cursor;
}
public String getRoom(String r) throws SQLException{
String roomName = null;
String[] columns = new String[]{KEY_ID2, KEY_ROOMMOVEHOLDER, KEY_ROOM};
Cursor c = ourDatabase.query(DATABASE_TABLE2, columns, KEY_ROOM + "=" + r , null, null, null, null);
if (c != null) {
c.moveToFirst();
roomName = c.getString(2);
}
return roomName;
}
}
每次调用此方法时都会发生错误
public String getRoom(String r) throws SQLException{
String roomName = null;
String[] columns = new String[]{KEY_ID2, KEY_ROOMMOVEHOLDER, KEY_ROOM};
Cursor c = ourDatabase.query(DATABASE_TABLE2, columns, KEY_ROOM + "=" + r , null, null, null, null);
if (c != null) {
c.moveToFirst();
roomName = c.getString(2);
}
return roomName;
}
这个的原因必须是表的声明,但我不确定。我使用adb shell检查了数据库,我看不到表存在并且在其中有一个值,但是错误说不存在这样的列。
答案 0 :(得分:8)
如果room
是字符类型(根据CREATE_TABLE_2
字符串定义为TEXT NOT NULL
),则需要替换:
KEY_ROOM + "=" + r
使用:
KEY_ROOM + "= '" + r + "'"
你拥有它的方式,你最终得到了查询片段:
where room = kitchen1
并且抱怨该表中没有kitchen1
列,这是正确的。
通过引用它,你最终得到了正确的结果:
where room = 'kitchen1'
这会将光标创建行转换为:
Cursor c = ourDatabase.query(DATABASE_TABLE2, columns,
KEY_ROOM + "='" + r + "'", null, null, null, null);
// ^^^^^^^^^^^^^^^^^^^^^^^^^
// Changed bit
答案 1 :(得分:0)
尝试输入虚拟数据字符串时,应调用INSERT VALUES ("'text'")
而不是INSERT VALUES ( "text" )
说明:因为sql命令将要在文本周围看到引号'
,而外部引号"
是供Java识别的,所以您试图传递/连接的是字符串