首页 文章

由db浏览器创建的sqlite db在android studio中不起作用

提问于
浏览
0

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

这是screenshot

1 回答

  • 0

    实际上,屏幕截图几乎确认资产文件夹中的文件是有效的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的表,它包含语言环境 .

    • 其他一些表格 .

    • 由于约束或隐含约束而自动创建的一些索引

    • 总之,一切都如预期 .

相关问题