从资产文件夹中读取数据库

Pra*_*esh 0 android android-sqlite android-database

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

SqliteDatabase.open(context.openassest().open(filrname),null); 未找到异常数据库文件不检查。我在我的腿上正确完成的语法请参阅内容

Mik*_*keT 5

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

要“打包”数据库,应将其包含在资产文件夹中,最好包含在数据库文件夹中(如果使用 SQLiteAssetHelper 而不进行修改,则需要)。

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

使用 SQLiteAssetHelper

  1. 第一步是创建要打包的数据库,这不会涵盖,因为有许多可用的工具。对于此示例,数据库是一个名为test.db的文件

  2. 然后您应该创建您的项目,在本例中,该项目被称为DBtest,公司 Domian 为com.DBtest,因此包名称为dbtest.com.dbtest

  3. 下一阶段是将数据库复制到资产文件夹中。

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

      • 在此输入图像描述
  4. 下一阶段是通过将 SQLiteAssetHelper 包含在应用程序的build.gradle中来设置项目以利用 SQLiteAssetHelper 。

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

在此输入图像描述


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

    1. 右键单击MainActivity java 类,选择“新建”,然后选择“Java 类”。
    2. 在名称字段中输入DBHelper
    3. 在 SuperClass 字段中开始输入 SQLiteAsset(现在 SQliteAssetHelper 类将是可选的),因此选择它。它应该解决为:-
    4. 单击“确定”。 在此输入图像描述
  2. 沿着以下方式为 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);
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 创建 DBHelper 的实例,然后访问数据库。

    1. 为了方便起见,请注意另一个名为CommonSQLiteUtilities的类,复制自是否有任何方法可以帮助解决常见的 SQLite 问题?
    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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)
  • 前两行来自SQliteAssethelper,其余的来自类logDatabaseInfo的方法CommonSQLiteUtilities
  • 在后续运行中,数据库将不会被复制,因为它已经存在。