关于android:从assets文件夹中读取数据库

Reading a database from the assets folder

本问题已经有最佳答案,请猛点这里访问。

我在资产文件夹中有一个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


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

要"打包"数据库应该包含在assets文件夹中,最好包含在数据库文件夹中(如果使用SQLiteAssetHelper而不进行修改则需要)。

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

利用SQLiteAssetHelper

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

  • 然后,您应该创建项目,在这种情况下,Project已被称为DBtest,Compnay Domian为com.DBtest,因此包名称为dbtest.com.dbtest。

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

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

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

  • 编辑App文件夹中的build.gradle。
  • 在依赖项部分中添加行implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
  • 单击立即同步
  • enter image description here

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

  • 右键单击MainActivity java类,选择New,然后选择Java Class。
  • 在Name字段中输入DBHelper。
  • 在SuperClass字段中,开始键入SQLiteAsset(现在可以选择SQliteAssetHelper类),因此选择它。它应该解决:
  • 单击
    enter image description here
  • 沿着行创建DBHelper类的构造函数

  • : -

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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);
        }
    }
  • 创建DBHelper的实例,然后访问数据库。

  • 注意为了简化另一个名为CommonSQLiteUtilities的类,从中复制是否有任何方法可以帮助解决常见的SQLite问题?

  • 使用类似的东西创建DBHelper cclass的实例

    • DBHelper mDBHlpr = new DBHelper(this);
  • 使用CommonSQLiteUtilities访问数据库使用: -

    • CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
  • MainActivity完全成为了

  • : -

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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());
        }
    }

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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,其余来自CommonSQLiteUtilities类的logDatabaseInfo方法。
    • 在subsequnt运行时,数据库将不会被复制,因为它已经存在。

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

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