android - 从 Assets 文件夹中读取数据库

标签 android android-sqlite android-database

<分区>

我在 Assets 文件夹中有一个 db 文件,我该如何使用它。我必须能够读写数据库文件 如果我使用

SqliteDatabase.open(context.openassest().open(filrname),null); Exception db file not found Don't check. The syntax I have done correctly in my lap see the content

最佳答案

要充分利用打包的数据库(即作为 Assets 包含的数据库),必须解压缩(自动)数据库并复制到合适的位置(通常是 data/data/<package_name>/databases/<database_name>,其中 <package_name><database_name> 将根据分别为应用程序的包名称和数据库名称)。

要“打包”数据库,应该将其包含在 Assets 文件夹中,最好是数据库文件夹(如果使用 SQLiteAssetHelper 而无需修改则需要)。

此外,必须在实际打开数据库之前完成复制,然后才能打开它。

使用 SQLiteAssetHelper

  1. 第一步是创建要打包的数据库,这部分不会介绍,因为有很多工具可用。对于此示例,数据库是一个名为 test.db

  2. 的文件
  3. 然后您应该创建您的项目,在这种情况下,该项目被称为 DBtest,Compnay Domian 为 com.DBtest,因此包名称为 dbtest.com.dbtest.

  4. 下一步是将数据库复制到 Assets 文件夹中。

    1. src/main 文件夹中创建 assets 文件夹(如果尚不存在)。
    2. 在 **assets 文件夹中创建 databases""文件夹(如果尚不存在)。
    3. 将数据库文件(本例中为 test.db)复制到数据库文件夹中。

      • > enter image description here
  5. 下一阶段是将项目设置为利用 SQLiteAssetHelper,方法是将其包含在应用程序的 build.gradle 中。

    1. 编辑 App 文件夹中的 build.gradle
    2. 添加行 implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'在依赖项部分。
    3. 点击立即同步

enter image description here


  1. 创建一个类,它是新的/现在可用的 SQLiteAssethelper 类的子类。在本练习中,它将被称为 DBHelper

    1. 右键单击 MainActivity java 类,选择新建,然后选择 Java 类。
    2. 在名称字段中输入 DBHelper
    3. 在 SuperClass 字段中开始输入 SQLiteAsset(现在 SQliteAssetHelper 类是可选的),所以选择它。它应该解决为:-
    4. 点击确定。 enter image description here
  2. 按照

  3. 的行创建 DBHelper 类的构造函数

:-

public class DBHelper extends SQLiteAssetHelper {

    public static final String DBNAME = "test.db"; //<<<< must be same as file name
    public static final int DBVERSION = 1;

    public DBHelper(Context context) {
        super(context,DBNAME,null,DBVERSION);
    }
}
  1. 创建 DBHelper 实例,然后访问数据库。

    1. 注意另一个名为 CommonSQLiteUtilities 的类,复制自 Are there any methods that assist with resolving common SQLite issues?
    2. 使用类似于

      的方式创建 DBHelper cclass 的实例
      • DBHelper mDBHlpr = new DBHelper(this);
    3. 使用 CommonSQLiteUtilities 访问数据库:-

      • CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
    4. 完整的 MainActivity 变成了

:-

public class MainActivity extends AppCompatActivity {

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

        DBHelper mDBHlpr = new DBHelper(this);
        CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
    }
}

结果是成功运行日志记录:-

04-11 06:12:55.091 1401-1401/dbtest.com.dbtest W/SQLiteAssetHelper: copying database from assets...
    database copy complete
04-11 06:12:55.123 1401-1401/dbtest.com.dbtest I/SQLiteAssetHelper: successfully opened database test.db
04-11 06:12:55.127 1401-1401/dbtest.com.dbtest D/SQLITE_CSU: DatabaseList Row 1 Name=main File=/data/data/dbtest.com.dbtest/databases/test.db
    Database Version = 1
    Table Name = mytable Created Using = CREATE TABLE mytable (
        _id INTEGER PRIAMRY KEY, 
        mydata TEXT, 
        inserted INTEGER DEFAULT CURRENT_TIMESTAMP
    )
    Table = mytable ColumnName = _id ColumnType = INTEGER PRIAMRY KEY Default Value = null PRIMARY KEY SEQUENCE = 0
    Table = mytable ColumnName = mydata ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    Table = mytable ColumnName = inserted ColumnType = INTEGER Default Value = CURRENT_TIMESTAMP PRIMARY KEY SEQUENCE = 0
    Table Name = android_metadata Created Using = CREATE TABLE android_metadata (locale TEXT)
    Table = android_metadata ColumnName = locale ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
  • 前两行来自 SQliteAssethelper ,其余来自 logDatabaseInfo 的方法 CommonSQLiteUtilities 类。
  • 在后续运行中,数据库不会被复制,因为它已经存在。

关于android - 从 Assets 文件夹中读取数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49756892/

相关文章:

android - 飞溅 Activity 期间数据库加载缓慢

android - 如何修复我的 Android SQLite 数据库?

java - 当我执行代码时,sqlite 中发生错误= CursorIndexOutOfBoundsException

android - CKEditor 4.4.7 不显示在任何移动浏览器上

android - LibGDX:Android SpriteBatch 不绘制

android - 使用 Room 打开具有指定路径的 SQLite 数据库

java - 即使应用程序完全关闭后,如何将按钮的状态(例如按钮的可见性)保存在 RecyclerView 项内?

android - JobSchedulerService 中的 RoomDB

android - 如何在Android中实现facebook评论插件

mysql - 如果最后一条记录与之前的记录重复,则android-db查询获取最后一条记录或组中的第一条