【发布时间】:2015-04-08 03:59:41
【问题描述】:
所以我在表中插入信息没有任何问题,但是当我尝试查询我的数据库时,我似乎在检索它时遇到了问题。我一般是 SQLite 和数据库的新手,所以我的理解可能不同。以下是我的常量的声明:
public static abstract class TableInfo implements BaseColumns
{
//User Table
public static final String USER_NAME = "user_name";
public static final String USER_PASS = "user_pass";
public static final String USER_FNAME = "user_fname";
public static final String USER_LNAME = "user_lname";
public static final String DATABASE_NAME = "current_users";
public static final String USER_TABLE = "user_info";
//Message Table
public static final String MESSAGE_ID = "msg_id";
public static final String RECEIVER_ID = "receiver_id";
public static final String SENDER_ID = "sender_id";
public static final String MESSAGE = "message";
public static final String STATUS = "status";
public static final String MSG_TABLE = "msg_info";
这是我创建表的查询字符串(有效)
public String CREATE_MSG_TABLE = "CREATE TABLE " + TableData.TableInfo.MSG_TABLE +
" ( " + TableData.TableInfo.MESSAGE_ID + " INTEGER PRIMARY KEY, "
+ TableData.TableInfo.RECEIVER_ID + " TEXT, "
+ TableData.TableInfo.SENDER_ID + " TEXT, "
+ TableData.TableInfo.MESSAGE + " TEXT, "
+ TableData.TableInfo.STATUS + " INTEGER);";
public void onCreate(SQLiteDatabase sdb){
sdb.execSQL(CREATE_USER_TABLE);
Log.d("Database operations", "Table1 created");
sdb.execSQL(CREATE_MSG_TABLE);
Log.d("Database operations", "Table2 created");
}
这是我用来查询数据库以获取我的信息的方法。它是一个消息传递应用程序,所以我想要接收者 ID 和消息:
public Cursor getInformationMsgTable(DatabaseOperations dop) {
SQLiteDatabase SQ = dop.getWritableDatabase();
Cursor CR = SQ.rawQuery("SELECT "
+ TableData.TableInfo.RECEIVER_ID + ","
+ TableData.TableInfo.SENDER_ID + ","
+ TableData.TableInfo.MESSAGE + ","
+ TableData.TableInfo.STATUS
+ " FROM " + TableData.TableInfo.MSG_TABLE,null);
return CR;
}
最后,当我用光标返回时,我会这样做:
private void loadMessages()
{
DatabaseOperations DOP = new DatabaseOperations(CTX);
//The cursor will iterate through the DB
Cursor CR = DOP.getInformationMsgTable(DOP);
if(CR.getCount() > 0)
{
CR.moveToFirst();
String[] fromFieldNames = new String[]
{
TableData.TableInfo.RECEIVER_ID,
TableData.TableInfo.MESSAGE
};
int[] toViewIDs = new int[]
{
R.id.userNameFromDB,
R.id.messageInfoDB
};
SimpleCursorAdapter myCursorAdapter;
myCursorAdapter = new SimpleCursorAdapter(
CTX,
R.layout.item_layout,
CR,
fromFieldNames,
toViewIDs);
ListView myList = (ListView) findViewById(R.id.friendsLV);
myList.setAdapter(myCursorAdapter);
}
}
我在表中插入了多行,每次我都会记录。但我得到的错误是“java.lang.IllegalArgumentException:列'_id'不存在”,它指的是receiver_id列。有什么想法吗?我觉得奇怪的是它会删除“_”之前的部分。此外,当表为空时,我可以使用加载消息功能并且没有任何问题,但是当我向表中添加一行然后查询表时,我会遇到问题和错误。谢谢。编辑:我复制了错误的功能,现在已更正。
请求的跟踪: 04-07 23:14:57.850 32315-32315/com.example.andy.justalk D/AndroidRuntime: 关闭虚拟机 04-07 23:14:57.852 32315-32315/com.example.andy.justalk E/AndroidRuntime:致命异常:主要 进程:com.example.andy.justtalk,PID:32315 java.lang.IllegalArgumentException:列“_id”不存在 在 android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303) 在 android.widget.CursorAdapter.init(CursorAdapter.java:172) 在 android.widget.CursorAdapter.(CursorAdapter.java:120) 在 android.widget.ResourceCursorAdapter.(ResourceCursorAdapter.java:52) 在 android.widget.SimpleCursorAdapter.(SimpleCursorAdapter.java:78) 在 com.example.andy.justtalk.FriendsList.loadMessages(FriendsList.java:72) 在 com.example.andy.justtalk.FriendsList.access$000(FriendsList.java:17) 在 com.example.andy.justtalk.FriendsList$1.onClick(FriendsList.java:35) 在 android.view.View.performClick(View.java:4780) 在 android.view.View$PerformClick.run(View.java:19866) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
【问题讨论】:
-
您能否发布有关此错误的完整 logcat 跟踪信息?
-
我没有丰富的 SQLite 经验,但在您选择的末尾没有看到
;。 -
不幸的是,这并没有什么不同@smskelley