由数据库浏览器创建的sqlite数据库在Android Studio中不起作用

时间:2018-12-09 08:47:36

标签: android database sqlite android-studio db-browser-sqlite

我已经使用数据库浏览器创建了一个SQLite数据库,当我将其移动到资产文件夹并在android studio中打开它时,它看起来非常糟糕并且无法正常工作。解决办法是什么 ? :(

这是一个screenshot

1 个答案:

答案 0 :(得分:0)

实际上,屏幕截图几乎确认了资产文件夹中的文件是有效的SQLite数据库。

这是前16个字节与数据库标头的字节匹配标头字符串:“ SQLite格式3 \ 000” Database File Format

Android Studio本身不包含将文件作为SQLite数据库实际打开的要求(有一些工具,例如DB Browser可以执行此操作)。

对于您的应用程序,您需要做的是将文件作为SQLiteDatabase打开。通常,这是通过以下步骤完成的:将文件从资产文件夹复制到合适的位置(由于资产文件夹是软件包的一部分,它是只读的),然后通常通过SQLiteOpenHelper的子类从该位置打开文件。

有一个可用的类,即SQLiteAssetHelper,可以使打开数据库相对容易。 请注意,SQLiteAssetHelper希望数据库(名称与包含扩展名的文件名相同)位于资产文件夹的 databases 文件夹中(您可能必须创建此文件夹,尽管屏幕截图显示您已经将数据库放入了数据库文件夹中。

示例

以下是使用SQliteAssethelper打开数据库的快速示例,在这种情况下,按照sqlite_master(SQlite的主表)列出项目(表,视图,索引,触发器等)。

Build.gradle (应用程序)(部分):-

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'
}
  • 查看评论重新添加的行

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();
    }
}

一个调用活动(例如) 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-它确认从资产文件夹复制了数据库。
  • 第二行显示表android_metadata,这是将添加的特定于android的表,其中包含语言环境。
  • 其他一些表。
  • 由于约束或隐含约束而自动创建的一些索引
  • 简而言之,一切都如预期。