我是初学Android开发者。 我正在开发一个使用具有复杂数据库模式的数据库的应用程序。
所以我做的是首先创建一个数据库添加表,触发器和视图。 我还添加了样本数据。
我阅读了一些关于如何在Android应用程序中使用现有数据库并获得代码的在线教程。
我根据需要在资源文件夹中有db,以及将db复制到应用程序文件夹的代码。
问题是代码可能正在复制一个空数据库。使用模拟器,我首先必须手动将db文件从assets文件夹拖放到应用程序文件夹才能工作。
实际的db文件大小为5000kb,而代码只复制3000kb的文件。
当我将一个实际的Android设备连接到我的笔记本电脑并运行该应用程序时,它会失败,因为代码复制的是一个没有表格,视图等的空数据库。
我还创建了一个实际的apk文件,并使用adb工具将其安装在模拟器上。它也失败了。
我也注意到使用实际的Android手机,由于权限限制,我无法将数据库物理拖放到app文件夹中。
即使有效,也不可行。
所以我想知道问题是否与代码有关?以下是我正在使用的内容。
// database helper variables
private final Context mycontext;
private static String DB_PATH="data/data/com.example.metermanager/databases/";
private static String DB_NAME;
public SQLiteDatabase myDataBase;
public SQLiteDatabase getDb(){
return myDataBase;
}
public DatabaseHelperClass(Context context,String databaseName){
super(context,databaseName,null,1);
this.mycontext=context;
try{
Log.v("Path",DB_PATH);
DB_NAME=databaseName;
Log.v("name",DB_NAME);
openDataBase();
}catch(Exception e){
Log.e("gezaaako",e.toString());
}
}
public void createdatabase() throws IOException{
boolean dbexist=checkdatabase ();
if(!dbexist) {
this.getReadableDatabase();
copydatabase();
} else {
Log.d("Exits","Db Exist");
}
}
private boolean checkdatabase(){
SQLiteDatabase checkDb=null;
try{
String myPath=DB_PATH+DB_NAME;
checkDb=SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
Log.e("InCheckDatabasesub",e.toString());
}
if(checkDb!=null){
checkDb.close();
}
return checkDb!=null;
}
private void copydatabase(){
InputStream myinput = null;
try {
myinput = mycontext.getAssets().open(DB_NAME);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String outfilename=DB_PATH+DB_NAME;
FileOutputStream myoutput = null;
try {
myoutput = new FileOutputStream(outfilename);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] buffer= new byte[1024];
int length;
try {
while ((length=myinput.read(buffer))>0){
myoutput.write(buffer,0,length);
}
myoutput.flush();
myoutput.close();
myinput.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public SQLiteDatabase openDataBase() throws SQLException
{
String myPath=DB_PATH+DB_NAME;
Log.e("CheckPath",myPath);
if (myDataBase==null){
try {
createdatabase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
myDataBase=SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
}
return myDataBase;
}
public synchronized void close(){
if(myDataBase!=null){
myDataBase.close();
}
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
罗纳德
答案 0 :(得分:0)
我已使用this Library从assert-folder执行复制,并且非常好地处理访问权限限制。它还需要一个zipped
数据库,可以节省大量的应用程序空间。