我想使用预加载的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) {}
}
}
}