Android中SQLite外键插入问题求助:消息表Userid字段为空
解决Message表外键Userid为空的问题
嘿,作为Android新手遇到这个问题太正常啦,咱们一步步拆解解决:
首先核心问题很明确:你的saveMessage方法完全没给Message表的外键字段COLUMN_USER赋值,插入数据时这个字段自然是空的。另外还有个小细节要注意——你定义Message表时把COLUMN_USER设成了TEXT类型,但User表的主键_ID是INTEGER,外键类型最好和主键保持一致,避免后续出现类型不匹配的坑。
1. (可选但推荐)修正Message表的创建语句
把COLUMN_USER的类型改成INTEGER,和User表的主键类型匹配:
String TABLE_MESSAGE_CREATE = "CREATE TABLE "+ MessageTable.Messages.TABLE_NAME+"("+ MessageTable.Messages._ID+" INTEGER PRIMARY KEY,"+ MessageTable.Messages.COLUMN_USER+" INTEGER,"+ // 调整为INTEGER类型 MessageTable.Messages.COLUMN_SUBJECT+ " TEXT,"+ MessageTable.Messages.COLUMN_MESSAGE+" TEXT,"+ " FOREIGN KEY ("+ MessageTable.Messages.COLUMN_USER+") REFERENCES "+ UserTable.Users.TABLE_NAME+"("+ UserTable.Users._ID+"))";
2. 修改saveMessage方法,添加用户ID参数
更新方法,让它接收当前登录用户的ID,然后把这个ID存入ContentValues:
public long saveMessage(long userId, String subjects, String messages){ SQLiteDatabase db = getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(MessageTable.Messages.COLUMN_USER, userId); // 新增外键赋值 contentValues.put(MessageTable.Messages.COLUMN_SUBJECT, subjects); contentValues.put(MessageTable.Messages.COLUMN_MESSAGE, messages); long newRowId = db.insert(MessageTable.Messages.TABLE_NAME,null,contentValues); db.close(); return newRowId; }
如果你的Userid是字符串类型(不过从User表定义来看是INTEGER主键,所以long类型更合适),就把参数改成String userId即可。
3. 登录后保存当前用户ID,调用方法时传入
用户登录验证通过后,你需要把当前用户的Userid保存下来(比如用SharedPreferences存储,或者存在全局变量里):
// 假设登录时从User表查询到了当前用户的主键ID long currentUserId = ...; // 保存到SharedPreferences,方便后续获取 SharedPreferences sp = getSharedPreferences("UserPrefs", MODE_PRIVATE); sp.edit().putLong("current_user_id", currentUserId).apply();
然后在发送消息的页面,取出这个ID再调用saveMessage:
// 获取当前登录用户的ID SharedPreferences sp = getSharedPreferences("UserPrefs", MODE_PRIVATE); long currentUserId = sp.getLong("current_user_id", -1); if(currentUserId != -1){ // 调用保存消息的方法,传入用户ID long rowId = dbHandler.saveMessage(currentUserId, "测试主题", "测试内容"); } else { // 提示用户先登录 }
这样就能保证插入Message表时,外键Userid被正确填充啦。
内容的提问来源于stack exchange,提问作者An_developer
相关产品推荐
相关产品推荐

