android-从资产文件夹中读取数据库
作者:互联网
这个问题已经在这里有了答案: > Ship an application with a database 16个
我在资产文件夹中有一个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 /< package_name> / databases /< basebase_name>其中< ; package_name>和< database_name>将分别根据应用程序的软件包名称和数据库名称来确定).
要“打包”数据库,应将其包含在资产文件夹中,最好包含在数据库文件夹中(如果使用SQLiteAssetHelper而不进行修改,则是必需的).
另外,必须在实际打开数据库之前完成副本,然后才能打开数据库.
利用SQLiteAssetHelper
>第一步是创建要打包的数据库,因为有许多可用的工具,所以这不会涉及.对于此示例,数据库是名为test.db的文件
>在这种情况下,您应该创建您的项目,该项目已被称为DBtest,Compnay Domian为com.DBtest,因此程序包名称为dbtest.com.dbtest.
>下一步是将数据库复制到资产文件夹.
>在src / main文件夹中创建资产文件夹(如果尚不存在).
>在** assets文件夹中创建数据库“”文件夹(如果尚不存在).
>将数据库文件(在此示例中为test.db)复制到数据库文件夹中.
>下一步是通过将项目包含在App的build.gradle中来设置项目以利用SQLiteAssetHelper.
>在App文件夹中编辑build.gradle.
>在相关性部分中添加行实现’com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1′.
>单击立即同步
>创建一个类,该类是新的/现在可用的SQLiteAssethelper类的子类.在本练习中,它将称为DBHelper.
>右键单击MainActivity Java类,选择New,然后选择Java Class.
>在名称字段中输入DBHelper.
>在SuperClass字段中,开始输入SQLiteAsset(现在可以选择SQliteAssetHelper类),因此选择它.它应该解决为:
>单击确定.
>按照以下步骤为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);
}
}
>创建DBHelper的实例,然后访问数据库.
>为方便起见,另一个类名为CommonSQLiteUtilities,从Are there any methods that assist with resolving common SQLite issues?
复制而来
>使用类似于以下内容的方法创建DBHelper cclass的实例
> DBHelper mDBHlpr =新的DBHelper(this);
>使用CommonSQLiteUtilities,使用以下命令访问数据库:
> CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
> 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,其余行来自CommonSQLiteUtilities类的logDatabaseInfo方法.
>在子序列运行时,将不会复制数据库,因为它已经存在.
标签:android,android-sqlite,android-database 来源: https://codeday.me/bug/20191013/1908479.html