Android SQLite报错:users表不存在,插入用户失败(附代码)
解决SQLite "no such table: users" 异常问题
问题场景
在Android开发中创建SQLite表存储用户信息,调用添加用户方法时抛出异常:
E/SQLiteLog: (1) no such table: users in "INSERT INTO users(lastName,age,firstName) VALUES (?,?,?)"
核心问题排查
- 建表SQL语法错误:
DatabaseHandler的onCreate方法中,重复写入两次Util.lastName字段,完全遗漏了firstName字段,不仅导致表结构缺失必要字段,甚至可能因SQL语法问题直接导致表创建失败。 - 数据库升级逻辑错误:
onUpgrade方法中,删除语句错误指向数据库名而非目标表名,且execSQL参数使用不当,导致旧表无法被正确删除,重新建表的逻辑失效。 - 旧数据库缓存:SQLite的
onCreate仅在数据库首次创建时执行,若之前已创建过存在错误的数据库,错误表结构会一直保留,不会自动更新。
修复方案
1. 修正建表SQL语句
在onCreate方法中替换重复的lastName字段为firstName,确保表结构包含所有所需字段:
@Override public void onCreate(SQLiteDatabase db) { String CREATE_USERS_TABLE = "CREATE TABLE " + Util.TABLE_NAME + "(" + Util.KEY_ID + " INTEGER PRIMARY KEY," + Util.firstName + " TEXT," // 替换重复的lastName为firstName + Util.lastName + " TEXT," + Util.age + " TEXT" + ")"; db.execSQL(CREATE_USERS_TABLE); }
2. 修复数据库升级逻辑
修改onUpgrade方法,正确删除目标表并重建:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 先删除旧表 db.execSQL("DROP TABLE IF EXISTS " + Util.TABLE_NAME); // 重新创建表 onCreate(db); }
3. 触发数据库更新
执行以下任一操作,确保新表结构生效:
- 卸载当前应用后重新安装
- 提升
Util类中的DATABASE_VERSION数值(比如从1改为2),触发onUpgrade执行
完整修正后的DatabaseHandler类
package com.example.as.Data; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import com.example.as.Model.User; import com.example.as.util.Util; import java.util.ArrayList; import java.util.List; public class DatabaseHandler extends SQLiteOpenHelper { public DatabaseHandler(Context context) { super(context, Util.DATABASE_NAME, null, Util.DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String CREATE_USERS_TABLE = "CREATE TABLE " + Util.TABLE_NAME + "(" + Util.KEY_ID + " INTEGER PRIMARY KEY," + Util.firstName + " TEXT," + Util.lastName + " TEXT," + Util.age + " TEXT" + ")"; db.execSQL(CREATE_USERS_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + Util.TABLE_NAME); onCreate(db); } public void addContact(User user){ SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(Util.firstName, user.getFirstName()); values.put(Util.lastName, user.getLastName()); values.put(Util.age, user.getAge()); db.insert(Util.TABLE_NAME, null, values); Log.d("DBHandler", "addContact: item added"); db.close(); } // 注释掉的getUser方法可根据需要恢复 /* public User getUser(int id){ SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(Util.TABLE_NAME,new String[]{Util.KEY_ID, Util.firstName, Util.lastName, Util.age}, Util.KEY_ID + "=",new String[]{String.valueOf(id)}, null,null,null); if (cursor!=null) cursor.moveToFirst(); User user = new User(); user.setId(Integer.parseInt(cursor.getString(0))); user.setFirstName(cursor.getString(1)); user.setLastName(cursor.getString(2)); user.setAge(cursor.getString(3)); return user; } */ public List<User> getAllContacts(){ List<User> userList = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); String selectAll = "SELECT * FROM " + Util.TABLE_NAME; Cursor cursor = db.rawQuery(selectAll,null); if(cursor.moveToFirst()){ do { User user = new User(); user.setId(Integer.parseInt(cursor.getString(0))); user.setFirstName(cursor.getString(1)); user.setLastName(cursor.getString(2)); user.setAge(cursor.getString(3)); userList.add(user); }while (cursor.moveToNext()); } return userList; } }
内容的提问来源于stack exchange,提问作者user18544509
相关产品推荐
相关产品推荐

