实际上,屏幕截图几乎确认资产文件夹中的文件是有效的SQLite数据库 .
这是前16个字节匹配的数据库头 The header string: "SQLite format 3\000" Database File Format .
Android Studio本身不包括将文件作为SQLite数据库进行操作性打开的要求(有一些工具,比如DB Browser这样做) .
使用App,您需要做的是将文件作为SQLiteDatabase打开 . 这通常通过将文件从资产文件夹复制到合适的位置来完成(因为资产文件夹是它只读取的包的一部分),然后通常通过SQLiteOpenHelper的子类从该位置打开它 .
有一个类可用,即SQLiteAssetHelper,可以使数据库相对容易打开 . Note SQLiteAssetHelper期望数据库(名称与包含扩展名的文件名相同)位于assets文件夹的 databases 文件夹中(您可能需要创建此文件夹,尽管屏幕截图显示您已将数据库放入数据库中)夹) .
示例
以下是使用SQliteAssethelper打开数据库的快速示例,在这种情况下,按照sqlite_master(SQlite的主表)列出项目(表,视图,索引,触发器等) .
Build.gradle (App)(部分): -
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:+' //<<<<<<<<<< ADDED JUST THIS LINE
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
See comment re added line
DatabaseHelper(SQLiteAssethelper的子类) DBHelper.java
public class DBHelper extends SQLiteAssetHelper {
public static final String DBNAME = "DaycareCenters.db";
public static final int DBVERSION = 1;
SQLiteDatabase mDB;
public DBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
}
调用Activity(作为示例) MainActivity.java
public class MainActivity extends AppCompatActivity {
DBHelper mDBHlpr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDBHlpr = new DBHelper(this);
Cursor csr = mDBHlpr.mDB.rawQuery("SELECT * FROM sqlite_master",null);
while (csr.moveToNext()) {
Log.d("SQLITEMASTER","Name = " + csr.getString(csr.getColumnIndex("name")) + " Type = " + csr.getString(csr.getColumnIndex("type")));
}
csr.close();
}
}
结果(写入日志)
注意我刚刚复制了一个方便复制的数据库,表等列表与你的不一样 .
.
12-09 09:55:19.760 1473-1473/? I/SQLiteAssetHelper: successfully opened database DaycareCenters.db
12-09 09:55:19.764 1473-1473/? D/SQLITEMASTER: Name = android_metadata Type = table
12-09 09:55:19.764 1473-1473/? D/SQLITEMASTER: Name = player_card Type = table
12-09 09:55:19.764 1473-1473/? D/SQLITEMASTER: Name = sqlite_autoindex_player_card_1 Type = index
12-09 09:55:19.764 1473-1473/? D/SQLITEMASTER: Name = email Type = table
12-09 09:55:19.764 1473-1473/? D/SQLITEMASTER: Name = region Type = table
12-09 09:55:19.764 1473-1473/? D/SQLITEMASTER: Name = card Type = table
12-09 09:55:19.764 1473-1473/? D/SQLITEMASTER: Name = pc Type = table
12-09 09:55:19.764 1473-1473/? D/SQLITEMASTER: Name = sqlite_autoindex_pc_1 Type = index
第一行来自SQliteAssetHelper - 它确认数据库是从assets文件夹复制的 .
第二行显示表android_metadata,这是一个将添加的特定于Android的表,它包含语言环境 .
其他一些表格 .
由于约束或隐含约束而自动创建的一些索引
总之,一切都如预期 .