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

如何通过编程方式向SQLite数据库插入数据?

编程方式向Android SQLite数据库插入数据的实现方法

嘿,我懂你要的是纯代码层面操作SQLite插入数据的方案,毕竟搜出来的命令行/工具方法对实际开发没啥帮助对吧?我结合你给出的MainActivity代码,一步步给你讲清楚怎么实现~

第一步:先确保你的数据表已经创建

你代码里的final String CREATE_BOOKS_TABLE可以补全成这样,先把books表的结构定义好:

public class MainActivity extends AppCompatActivity {
    private SQLiteDatabase db;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        // 打开或创建数据库
        db = openOrCreateDatabase("books.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);
        // 设置数据库基础配置
        db.setVersion(1);
        db.setLocale(Locale.getDefault());
        db.setLockingEnabled(true);

        // 定义创建books表的SQL语句
        final String CREATE_BOOKS_TABLE = "CREATE TABLE IF NOT EXISTS books (" +
                "_id INTEGER PRIMARY KEY AUTOINCREMENT," + // 自增主键
                "title TEXT NOT NULL," + // 书名,非空约束
                "author TEXT)"; // 作者字段

        // 执行创建表的SQL
        db.execSQL(CREATE_BOOKS_TABLE);

        // 接下来就可以插入数据啦👇
    }
}

第二步:两种插入数据的常用方法

方法1:用ContentValues插入(推荐,安全且易维护)

ContentValues会自动帮你处理数据类型转换,还能避免SQL注入问题,是官方推荐的方式:

// 1. 封装要插入的数据
ContentValues bookValues = new ContentValues();
bookValues.put("title", "Android编程权威指南");
bookValues.put("author", "Bill Phillips");

// 2. 插入到books表
// insert方法返回插入行的ID,失败则返回-1
long insertedRowId = db.insert("books", null, bookValues);

// 可以加个日志判断插入结果
if (insertedRowId != -1) {
    Log.d("MainActivity", "数据插入成功!行ID:" + insertedRowId);
} else {
    Log.e("MainActivity", "数据插入失败");
}

方法2:直接执行INSERT SQL语句(适合简单场景)

如果是固定数据或者你自己拼SQL(注意:绝对不要直接拼接用户输入的内容,要用占位符?来避免SQL注入):

// 用占位符代替具体值,第二个参数是占位符对应的实际数据
String insertSql = "INSERT INTO books (title, author) VALUES (?, ?)";
db.execSQL(insertSql, new Object[]{"Head First Android", "Dawn Griffiths"});

第三步:别忘了关闭数据库释放资源

数据库连接用完一定要关闭,不然会浪费系统资源,你可以在Activity的onDestroy方法里处理:

@Override
protected void onDestroy() {
    super.onDestroy();
    // 检查数据库是否打开,再关闭
    if (db != null && db.isOpen()) {
        db.close();
    }
}

额外建议:用SQLiteOpenHelper管理数据库(更规范)

虽然上面的代码能跑,但实际项目里更推荐用SQLiteOpenHelper来管理数据库的创建、版本升级,这样能避免很多潜在问题。给你个简单的示例:

// 先写一个继承SQLiteOpenHelper的类
public class BookDatabaseHelper extends SQLiteOpenHelper {
    // 数据库名称和版本号
    private static final String DB_NAME = "books.db";
    private static final int DB_VERSION = 1;

    public BookDatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 在这里创建表
        String CREATE_BOOKS_TABLE = "CREATE TABLE IF NOT EXISTS books (" +
                "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                "title TEXT NOT NULL," +
                "author TEXT)";
        db.execSQL(CREATE_BOOKS_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 版本升级时的处理,比如删除旧表重建(实际项目要考虑数据迁移)
        db.execSQL("DROP TABLE IF EXISTS books");
        onCreate(db);
    }
}

然后在MainActivity里使用这个Helper:

public class MainActivity extends AppCompatActivity {
    private BookDatabaseHelper dbHelper;
    private SQLiteDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        // 初始化Helper
        dbHelper = new BookDatabaseHelper(this);
        // 获取可写的数据库实例
        db = dbHelper.getWritableDatabase();

        // 然后用上面的方法插入数据即可...
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 关闭Helper,会自动关闭数据库连接
        dbHelper.close();
    }
}

这样你的数据库管理会更规范,后续版本升级也更方便~

内容的提问来源于stack exchange,提问作者Brendan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:27:39