我有一个 android 应用程序,它应该读取和扩展已经在 sqlite 上创建的数据库...通过将数据库放在模拟器文件资源管理器上的“data/data/(packagename)/database”文件夹中,它可以在模拟器上正常工作. 现在真实设备出现问题。显然它没有要打开的数据库。我试图将数据库放在资产文件夹中,但我没有用 openhelper 打开它。
5 回答
您应该将 .db 文件从资产文件夹复制到内部/外部存储。您可以使用以下代码,
private static String DB_PATH = "/data/data/your package/database/";
private static String DB_NAME ="final.db";// Database name
要创建数据库,
public void createDataBase() throws IOException
{
//If database not exists copy it from the assets
boolean mDataBaseExist = checkDataBase();
if(!mDataBaseExist)
{
try
{
//Copy the database from assests
copyDataBase();
Log.e(TAG, "createDatabase database created");
}
catch (IOException mIOException)
{
throw new Error("ErrorCopyingDataBase");
}
}
}
检查数据库是否存在于此处:/data/data/your package/database/DB Name
private boolean checkDataBase()
{
File dbFile = new File(DB_PATH + DB_NAME);
return dbFile.exists();
}
从资产中复制数据库
private void copyDataBase() throws IOException
{
InputStream mInput = getApplicationContext().getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream mOutput = new FileOutputStream(outFileName);
byte[] mBuffer = new byte[1024];
int mLength;
while ((mLength = mInput.read(mBuffer))>0)
{
mOutput.write(mBuffer, 0, mLength);
}
mOutput.flush();
mOutput.close();
mInput.close();
}
我希望它可以帮助你。
您不能直接从资产文件夹访问数据库,您需要先将其复制到路径 data/data/(packagename)/database 然后使用它:
private String DB_PATH = "/data/data/" + "yourpackaename" + "/databases/" + "db.db";
在你的 onCreate()
is = getAssets().open("db.db");
write(is);
然后调用的方法:
public void write(InputStream is) {
try {
OutputStream out = new FileOutputStream(new File(DB_PATH));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = is.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
is.close();
out.flush();
out.close();
System.err.println(out + "\n");
} catch (IOException e) {
e.printStackTrace();
}
}
您需要首先使用 java 代码将数据库文件从资产复制到应用程序数据位置。您可以发布一些代码来显示您如何打开或处理数据库吗?
您不能直接从资产文件夹中打开文件。相反,您需要将资产文件夹的内容复制到内部/外部存储中,然后使用该File
路径打开文件。在模拟器中,您可以更轻松地访问应用程序的数据文件夹。但是,在真正的非 root android 设备上,由于安全原因,这是不可能的。
您是否有一个预先填充的数据库并希望集成到您的应用程序中?如果是,您可以简单地使用我的图书馆
在您的应用安装后首次启动时
SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.COPY_TO_SYSTEM);
在随后的发布中
SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.READ_FROM_DEVICE);
只需触发 SQL 查询
database.sqlInject("INSERT INTO food VALUES('Banana','Vitamin A');");
以 CSV、JSON、XML 格式获取数组的结果
ArrayList<String> rows=new ArrayList<String>();
rows=database.sqlEjectCSV("SELECT * FROM food;");
for (int i=0;i<rows.size();i++)
{
//Do stuffs with each row
}
为此,您需要包括我的库。这里的文档:
https ://github.com/sangeethnandakumar/TestTube