在安卓系统中使用预加载的Sqlite数据库



我想使用预加载的sqlite数据库,该数据库大小为250兆字节。我已将数据库复制到资产文件夹中。由于我们不能直接访问资产数据库,我正在将数据库从资产复制到"context.getFilesDir()"文件夹
使用这种策略,我的应用程序适用于5-6兆字节的小型数据库,但如果我对大型数据库这样做,应用程序就会崩溃,这正是我想要的。

我想做的事情有什么更好的方法或问题吗?我已经尝试过可能的副本的解决方案Android:访问资产文件夹sqlite数据库文件,扩展名为.sqlite从.sqlite获取包含多个表和多列的列如何从Assets 在Android中使用预装的SQLite数据库

下面给出了我的SqliteHelper代码以供参考。

package com.example.database;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
/**
 * Created by MOHIT on 06-08-2014.
 */
public class SQLiteHelper  {
    private static final String DB_NAME = "alldb.sqlite";
    //private String DB_NAME = "alldb.sqlite";
    private Context context;
    private SQLiteDatabase database;
    public SQLiteHelper(Context context) {
        this.context = context;
    }
    public SQLiteDatabase openDatabase() {
        File dbFile = new File(context.getFilesDir(), DB_NAME);
        if (!dbFile.exists()) {
            try {
                copyDatabase(dbFile);
            } catch (IOException e) {
           //     Utilities.makeToastLong(context, "Error here");
                throw new RuntimeException("Error creating source database", e);
            }
        }
        database= SQLiteDatabase.openDatabase(dbFile.getPath(), null, SQLiteDatabase.OPEN_READONLY);
        return database;
    }
    public void closeDatabase()
    {
        if(database!=null&& database.isOpen())
          database.close();
    }
    private void copyDatabase(File dbFile) throws IOException {
        try {
            InputStream is = context.getAssets().open(DB_NAME);
            dbFile.createNewFile();
            OutputStream os = new FileOutputStream(dbFile,false);
            byte[] buffer = new byte[1024];
            while (is.read(buffer) > 0) {
                os.write(buffer);
            }
            os.flush();
            os.close();
            is.close();
        }catch (Exception e)
        {
            Log.e(SQLiteHelper.class.getSimpleName()," Error in Database copy "+e.getLocalizedMessage());
        }
    }
}

我在很多其他主题中读到,预加载的SQLite DB的大小限制为50MB。要绕过此限制,您可以:

1-将数据库复制到外部文件夹

2-从外部文件夹,将数据库复制到您的内部存储/data/data/yourApp

3-启动时检查DB是否存在,如果不复制则

谷歌博客的限制。您可能需要将Expansion File用于DB

这段代码,通过org.apache.commons.io.IIOutils.

public static void initialize(Context context) {
    File dbFile = getDatabaseAbsolutePath(context);
    if (!dbFile.exists()) {
        if (Ln.isDebugEnabled()) Ln.i("###### Copying preloaded DATABASE to: "+dbFile.getAbsolutePath());
        InputStream is = null;
        FileOutputStream fos = null;
        try {
            is = context.getAssets().open("init.db");
            fos = new FileOutputStream(dbFile);
            IOUtils.copy(is, fos);
        } catch (Exception e) {
            if ( Ln.isDebugEnabled()) e.printStackTrace();
        } finally {
            try {
                if (is != null) is.close();
                if (fos != null) fos.close();
            } catch(Exception e) {}
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新