2014-02-12 84 views
1

我是一名初學者的android開發人員。 我正在開發一個應用程序,它使用一個有點複雜的數據庫模式的數據庫。在應用程序中使用現有的sqlite數據庫的問題

所以我做的是先創建一個數據庫添加表,觸發器和視圖。 我還添加了示例數據。

我閱讀了一些關於如何在Android應用程序中使用現有數據庫並獲得代碼的在線教程。

我有資產文件夾中的數據庫根據需要和將數據庫複製到應用程序文件夾的代碼。

問題是代碼可能是複製一個空的數據庫。有了仿真器,我首先必須手動將資產文件夾中的db文件拖放到應用程序文件夾中才能使用。

鑑於實際的db文件大小是5000kb,代碼只複製3000kb的文件。

當我將一個實際的android設備連接到我的筆記本電腦並運行應用程序時,它失敗了,因爲代碼複製的內容是一個空數據庫,包含表,視圖..等等。

我也創建了一個實際的apk文件,並使用adb工具將其安裝在模擬器上。它也失敗了。

我也注意到,與實際的Android手機,我不能物理拖放到應用程序文件夾我認爲由於權限限制。

即使它工作,也是不可行的。

所以我想知道問題是否與代碼?以下是我正在使用的。

// 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

我用this Library做從斷言文件夾下的應對,它處理的訪問權限制非常好。它還需要一個zipped數據庫,它可以節省您的應用程序大小的大量空間。

+0

非常感謝你!去嘗試一下。 – user3079559

相關問題