You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android中assets目录SQLite数据库可修改?修改操作是否会被忽略?

关于Assets目录SQLite数据库修改的疑问解答

这个问题其实是很多刚接触Android SQLite的开发者都会踩的误区,我来给你捋清楚来龙去脉:

为什么你能修改"只读"的数据库?

Assets目录下的文件确实是只读的——APK安装后,assets里的内容打包在APK文件中,系统不允许直接修改APK内的任何文件。但你实际操作的并不是assets里的原数据库文件:

  • 当你调用getWritableDatabase()时,如果应用的私有数据目录(路径一般是/data/data/你的应用包名/databases/)里还没有这个数据库,Android会自动把assets目录中的数据库文件复制到这个可写的私有目录
  • 之后你所有的数据库操作(包括你写的UPDATE语句),都是针对这个私有目录里的数据库副本,而非assets里的原文件。

你的修改会被忽略吗?

完全不会!你执行的UPDATE语句已经成功修改了私有目录里的数据库副本,这些修改会被持久化保存。你可以通过Android Studio的Device File Explorer找到对应路径下的数据库文件,导出后用SQLite查看工具(比如SQLiteStudio)打开,就能看到likes列的值已经被更新了。

额外注意事项

  1. APK更新时的数据库覆盖问题:如果你后续更新APK,assets里的新数据库不会自动覆盖私有目录里的旧副本。如果需要更新数据库,你得自己实现版本判断逻辑——比如在数据库帮助类里增加版本号,当版本号提升时,执行数据库升级或者重新复制assets里的新数据库。
  2. SQL注入风险:你当前的execSQL写法存在SQL注入漏洞,建议改用更安全的写法:
// 方式1:带占位符的execSQL
sqLiteDatabase.execSQL("UPDATE quotes SET likes = ? WHERE id = ?", new Object[]{1, count});

// 方式2:使用update方法更简洁
ContentValues values = new ContentValues();
values.put("likes", 1);
sqLiteDatabase.update("quotes", values, "id = ?", new String[]{String.valueOf(count)});

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

火山引擎 最新活动