如何使用我自己的SQLite数据库?自己的、如何使用、数据库、SQLite

2023-09-12 07:05:49 作者:開鈊僦恏

我把我的数据库字段中的资产文件夹中。而使用从这个code blog复制数据库/数据/数据​​/ my_packname /数据库/,(此副本$ C $词来看,它在OnCreate()方法,当我运行此程序),然后使用SELECT * FROM ...获取数据。但它给我的异常:没有这样的表。

I put my database field in "assets" folder. And use the code from this blog to copy the database to "/data/data/my_packname/databases/", (This copy code i run it in the onCreate() method when i run this app) then use select * from ... to get data. But it gives me the exception: no such table.

有人告诉我,如果我试图把文件复制在SQLiteOpenHelper的onCreate(),为时已晚。因此,复制文件code不能复制完整的文件。

Someone told me that if i am attempting to copy the file in SQLiteOpenHelper's onCreate(), it's too late. So the copy file code can not copy the complete file.

所以,我需要使用adb或DDMS先拉数据库?

So i need to use adb or ddms to pull the database first?

所以,任何人都可以教我怎么用我自己的DATABSE? 你能告诉我设置?

So, Anyone can teach me how to use my own databse? Can you tell me the setup?

推荐答案

我已经用在博客文章中的说明,并发现了他们,而在正确的轨道上,狠狠被不必要地延长节外生枝 SQLiteOpenHelper 。我有更好的运气执行以下操作:

I've used the instructions in that blog post and found them, while on the right track, to severely complicate the issue by unnecessarily extending SQLiteOpenHelper. I've had much better luck doing the following:

创建通过复制到从资产正确的目录中创建静态的数据库,但没有得到自己就这么挂了继SQLiteOpenHelper格式的实用工具类。

Create a utility class that creates the static db by copying it into the correct directory from assets, but doesn't get itself so hung up on following the SQLiteOpenHelper format.

使用相同的工具类使用打开数据库 SQLiteDatabase.openDatabase()

Using the same utility class to open the db by using SQLiteDatabase.openDatabase()

编辑:这是一个版本,我创建这个工具类的;这是不够全面,但你会得到的漂移。

Here is a version of this utility class I've created; it's not quite complete, but you'll get the drift.

public class DbUtils {
    private static final String DB_PATH = "/data/data/com.mypackage.myapp/databases/";
    private static final String DB_NAME = "my.db";

    public static void createDatabaseIfNotExists(Context context) throws IOException {
        boolean createDb = false;

        File dbDir = new File(DB_PATH);
        File dbFile = new File(DB_PATH + DB_NAME);
        if (!dbDir.exists()) {
            dbDir.mkdir();
            createDb = true;
        }
        else if (!dbFile.exists()) {
            createDb = true;
        }
        else {
            // Check that we have the latest version of the db
            boolean doUpgrade = false;

            // Insert your own logic here on whether to upgrade the db; I personally
            // just store the db version # in a text file, but you can do whatever
            // you want.  I've tried MD5 hashing the db before, but that takes a while.

            // If we are doing an upgrade, basically we just delete the db then
            // flip the switch to create a new one
            if (doUpgrade) {
                dbFile.delete();
                createDb = true;
            }
        }

        if (createDb) {
            // Open your local db as the input stream
            InputStream myInput = context.getAssets().open(DB_NAME);

            // Open the empty db as the output stream
            OutputStream myOutput = new FileOutputStream(dbFile);

            // transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }

            // Close the streams
            myOutput.flush();
            myOutput.close();
            myInput.close();
        }
    }

    public static SQLiteDatabase getStaticDb() {
        return SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.OPEN_READONLY);
    }
}