2014-02-12 130 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

相关问题