2012-03-03 17 views
1

可能性の重複:
How to access an existing sqlite database in Android?使用既存のデータベース - Androidの開発

私は長い時間のために検索してきたが、私は答えを見つけることができません。私は、既存のSqliteデータベースtest.dbをアプリケーション内のデータと共にコピーしたいと思います。だからユーザーがアプリケーションからアプリケーションをダウンロードすると、dbも一緒に納品されます。

今、私はチュートリアルthisthisへの参照をたくさん見ました。しかし、それらのどれも私のために働くことはありません。

public class DatabaseAdapter extends SQLiteOpenHelper { 
     private static String dbPath= "data/data/test.test.test/databases/"; 
     private static String dbName = "test"; 
     private SQLiteDatabase applicationDatabase; 
     private final Context applicationContext; 


     public DatabaseAdapter(Context context) {  
       super(context, dbName , null, 3); 
       this. applicationContext = context; 
     } 


     public boolean checkDataBase(){ 
       File dbFile = new File(dbPath + dbName); 
    return dbFile.exists(); 
    } 


      public void copyDataBase() throws IOException{ 
    try { 

        InputStream input = applicationContext .getAssets().open(dbName); 
          String outPutFileName= dbPath + dbName ; 
         OutputStream output = new FileOutputStream(outPutFileName); 
         byte[] buffer = new byte[1024]; 
        int length; 
        while ((length = input.read(buffer))>0){ 
        output.write(buffer, 0, length); 
        } 
        output.flush(); 
        output.close(); 
        input.close(); 
     } 
         catch (IOException e) { 
        Log.v("error",e.toString()); 
        } 
    } 


      public void openDataBase() throws SQLException{ 
       String fullDbPath= dbPath + dbName; 
       applicationDatabase = SQLiteDatabase.openDatabase(fullDbPath,  null,SQLiteDatabase.OPEN_READONLY); 
    } 

       @Override 
    public synchronized void close() { 
      if(applicationDatabase != null) 
      applicationDatabase .close(); 
       super.close(); 
    } 
@Override 
public void onCreate(SQLiteDatabase arg0) { 
    // TODO Auto-generated method stub 

} 


@Override 
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { 
    // TODO Auto-generated method stub 

} 

public void getit(){ 
    this.getReadableDatabase().rawQuery("SELECT * FROM test", null); 
} 






} 

エラーコード= 1が表示されます。 データベースが作成されていることを確認すると、テーブルandroid_metadataのみが作成されます。

実例はありますか?

答えて

6

EDIT - これは私の動作するコードです。私はあなたが投稿した情報を追加しましたが、あなたがしなかった他の変数があるかもしれないので、少し修正する必要があります。

public class DatabaseAdapter extends SQLiteOpenHelper { 

    private Context mycontext; 

    private String DB_PATH = "data/data/test.test.test/databases/"; 
    private static String DB_NAME = "test"; 
    // the extension may be .sqlite 
    // or .db 
    public SQLiteDatabase myDataBase; 

    public DatabaseAdapter(Context context) { 
     super(context, DB_NAME, null, 1); 
     this.mycontext = context; 
     boolean dbexist = checkdatabase(); 
     if (dbexist) { 
     } else { 
      System.out.println("Database doesn't exist"); 
      try { 
       createdatabase(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 

    public void createdatabase() throws IOException { 
     boolean dbexist = checkdatabase(); 
     if (dbexist) { 
     } else { 
      this.getReadableDatabase(); 
      try { 
       copydatabase(); 
      } catch (IOException e) { 
       throw new Error("Error copying database"); 
      } 
     } 
    } 

    private boolean checkdatabase() { 
     boolean checkdb = false; 
     try { 
      String myPath = DB_PATH + DB_NAME; 
      File dbfile = new File(myPath); 
      checkdb = dbfile.exists(); 
     } catch (SQLiteException e) { 
      System.out.println("Database doesn't exist"); 
     } 

     return checkdb; 
    } 

    private void copydatabase() throws IOException { 

     // Open your local db as the input stream 
     InputStream myinput = mycontext.getAssets().open(DB_NAME); 

     // Path to the just created empty db 
     @SuppressWarnings("unused") 
     String outfilename = DB_PATH + DB_NAME; 

     // Open the empty db as the output stream 
     OutputStream myoutput = new FileOutputStream(
       "data/data/test.test.test/databases/test"); 

     // transfer byte to inputfile to outputfile 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myinput.read(buffer)) > 0) { 
      myoutput.write(buffer, 0, length); 
     } 

     // Close the streams 
     myoutput.flush(); 
     myoutput.close(); 
     myinput.close(); 

    } 

    public void open() { 
     // Open the database 
     String mypath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(mypath, null, 
       SQLiteDatabase.OPEN_READWRITE); 

    } 

    public synchronized void close() { 
     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

今、私が手:SQLiteが返されました:エラーコード= 14、MSG =ソースライン25467. Sqlite3_open_v2( "データ/データ/ test.test.test /データベース/ oww_db"、&扱う、1、NULL)でファイルを開けませんが失敗することができます。 test.dbデータベースには1つの列がありました。 dbはコピーされましたが、上記のエラーが発生しました。そして、oww_db.dbには多くのテーブルがあり、データベースはコピーされましたが、 "android_metadata"テーブルのみがコピーされていました。そして私はまた、上記のエラーを取得します。 –

+0

私が使っているコードを分けて、あなたの情報と共にそれを投稿します。私はそれが私のために働くことを知っているので、あなたはそれを試して、あなたのために動作するかどうかを確認することができます –

+0

ありがとう!感謝します! –

0

各テーブルに "_id"列がありますか?

+0

はいすべての表に_id列があります。 –

関連する問題