【问题标题】:sqlite db which created by db browser does not work in android studio由db浏览器创建的sqlite db在android studio中不起作用
【发布时间】:2018-12-09 08:47:36
【问题描述】:

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

这是screenshot

【问题讨论】:

  • 为什么要打开它?查看数据?
  • 不,只是因为当我尝试查询数据库时应用程序停止了。所以我发现问题出在数据库中(看截图)

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


【解决方案1】:

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

即前16个字节匹配数据库头头字符串:"SQLite format 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();
    }
}

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

【讨论】:

  • 在哪里记录?看看结果
  • 为什么当我尝试查询数据库时应用程序停止了:(
  • 在 Android Studio 中点击底部附近的 Logcat。查询可能无法正常工作的原因有很多(同样,logcat 应该说明原因)。您真的应该问另一个问题(特别是如果您使用了上述内容并且表格等已在 logcat 中列出,因为这回答了您最初的问题,在这种情况下您应该将问题打勾为已回答)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多