You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 (?,?,?)"

核心问题排查

  1. 建表SQL语法错误:DatabaseHandler的onCreate方法中,重复写入两次Util.lastName字段,完全遗漏了firstName字段,不仅导致表结构缺失必要字段,甚至可能因SQL语法问题直接导致表创建失败。
  2. 数据库升级逻辑错误:onUpgrade方法中,删除语句错误指向数据库名而非目标表名,且execSQL参数使用不当,导致旧表无法被正确删除,重新建表的逻辑失效。
  3. 旧数据库缓存: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:57:29