在app中使用现有sqlite数据库的问题

时间:2014-02-12 15:41:29

标签: android database android-sqlite

我是初学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
}

罗纳德

1 个答案:

答案 0 :(得分:0)

我已使用this Library从assert-folder执行复制,并且非常好地处理访问权限限制。它还需要一个zipped数据库,可以节省大量的应用程序空间。