我有一个Android应用程序,它应该读取和扩展已经在sqlite上创建的数据库......它可以通过将数据库放在文件的“data / data /(packagename)/ database”文件夹中在模拟器上正常工作模拟器的探索者。现在问题出现在真实设备上。显然它没有打开数据库。我试图将数据库放在assets文件夹中,但我没有用openhelper打开它。
答案 0 :(得分:6)
您应该将.db文件从assets文件夹复制到内部/外部存储。您可以使用以下代码
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();
}
我希望它可以帮助你。
答案 1 :(得分:3)
您无法直接从资产文件夹访问数据库,您需要先将其复制到路径数据/数据/(包名)/数据库,然后使用它:
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();
}
}
答案 2 :(得分:0)
您无法直接打开资产文件夹中的文件。相反,您需要在内部/外部存储上复制资产文件夹的内容,然后使用File
路径打开该文件。
在模拟器中,您可以更轻松地访问应用程序的数据文件夹。但是,在真正的非root用户设备上,由于安全原因,它无法实现。
答案 3 :(得分:0)
您需要先使用java代码将数据库文件从资产复制到应用程序数据位置。您可以发布一些代码来显示如何打开或处理数据库?
答案 4 :(得分:0)
您是否拥有预先填充的数据库并希望集成到您的应用中?如果是,您可以使用我的库
在您的应用安装后首次启动
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
获取Array的结果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