从assets文件夹中读取数据库

时间:2018-04-10 14:57:35

标签: android android-sqlite android-database

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

  

SqliteDatabase.open(context.openassest().open(filrname),null);   找不到异常db文件   不检查。我在膝盖上正确完成的语法见内容

2 个答案:

答案 0 :(得分:3)

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

To&#34; package&#34;数据库应该包含在assets文件夹中,最好包含在数据库文件夹中(如果使用SQLiteAssetHelper而不需要修改,则需要)。

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

使用SQLiteAssetHelper

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

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

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

    1. src / main 文件夹中创建资产文件夹,如果它尚不存在。
    2. 创建数据库&#34;&#34; **资产文件夹中的文件夹,如果它尚未存在。
    3. 将数据库文件(在此示例中为 test.db )复制到数据库文件夹中。

      • enter image description here
  5. 下一步是设置项目以利用SQLiteAssetHelper将其包含在App的 build.gradle 中。

    1. 修改 App 文件夹中的 build.gradle
    2. 在依赖项部分中添加行<database_name>
    3. 点击立即同步
  6. enter image description here

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

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

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

      : -

      implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
      1. 创建DBHelper的实例,然后访问数据库。

        1. 注意 以简化从Are there any methods that assist with resolving common SQLite issues?
        2. 复制的另一个名为 CommonSQLiteUtilities 的类>
        3. 使用

          行中的内容创建DBHelper cclass的实例
          • 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); } }
        4. 使用CommonSQLiteUtilities访问数据库: -

          • DBHelper mDBHlpr = new DBHelper(this);
        5. MainActivity已全部成为

      2. : -

        CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());

        结果是成功运行记录: -

        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 方法类。
        • 在subsequnt运行时,数据库将不会被复制,因为它已经存在。

答案 1 :(得分:0)

您可以在安装时将数据库从资产复制到数据库文件夹,然后从那里使用它。

/data/data/<Your-Application-Package-Name>/databases/<your-database-name>