2016-05-28 6 views
0

私は多くの時間、私のアンドロイドアプリで既存のデータベースsqliteを使用しようとしました! 私は新しいデータベースを作成することができますが、ここでは既存のデータベースを使用したいと思います! これは私のコードです。エラーはありません。エラーはありません。 しかし、それはうまくいきません。既存のDB - SQLite /アンドロイド - dbから読み取る

DataBaseHelper.java:

public class DataBaseHelper extends SQLiteOpenHelper { 

    private static String DB_PATH = "/data/data/com.global.getrain/databases/"; 

    private static String DB_NAME = "BookDB"; 

    private SQLiteDatabase myDataBase; 

    private Context myContext; 

    public DataBaseHelper(Context context) { 

     super(context, DB_NAME, null, 1); 
     this.myContext = context; 
    } 


    public void createDataBase() throws IOException{ 

      boolean dbExist = checkDataBase(); 

      if(dbExist){ 
      }else{ 

       this.getReadableDatabase(); 

       try { 

        copyDataBase(); 

       } catch (IOException e) { 

        throw new Error("Error copying database"); 

       } 
      } 

     } 


     public boolean checkDataBase(){ 

      SQLiteDatabase checkDB = null; 

      try{ 
       String myPath = DB_PATH + DB_NAME; 
       checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

      }catch(SQLiteException e){ 


      } 

      if(checkDB != null){ 

       checkDB.close(); 

      } 

      return checkDB != null ? true : false; 
     } 


     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 
      String outFileName = DB_PATH + DB_NAME; 

      //Open the empty db as the output stream 
      OutputStream myOutput = new FileOutputStream(outFileName); 

      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 openDataBase() throws SQLException{ 

      //Open the database 
      String myPath = DB_PATH + DB_NAME; 
      myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

     } 

     @Override 
     public synchronized void close() { 

       if(myDataBase != null) 
        myDataBase.close(); 

       super.close(); 

     } 



    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // SQL statement to create book table 
     String CREATE_BOOK_TABLE = "CREATE TABLE books (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "title TEXT, " 
       + "author TEXT)"; 

     // create books table 
     db.execSQL(CREATE_BOOK_TABLE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older books table if existed 
     db.execSQL("DROP TABLE IF EXISTS books"); 

     // create fresh books table 
     this.onCreate(db); 
    } 

    // Books table name 
    private static final String TABLE_BOOKS = "books"; 

    // Books Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_TITLE = "title"; 
    private static final String KEY_AUTHOR = "author"; 

    private static final String[] COLUMNS = { KEY_ID, KEY_TITLE, KEY_AUTHOR }; 

    public void addBook(Book book) { 
     Log.d("addBook", book.toString()); 
     // 1. get reference to writable DB 
     SQLiteDatabase db = this.getWritableDatabase(); 

     // 2. create ContentValues to add key "column"/value 
     ContentValues values = new ContentValues(); 
     values.put(KEY_TITLE, book.getTitle()); // get title 
     values.put(KEY_AUTHOR, book.getAuthor()); // get author 

     // 3. insert 
     db.insert(TABLE_BOOKS, // table 
       null, // nullColumnHack 
       values); // key/value -> keys = column names/ values = column 
          // values 

     // 4. close 
     db.close(); 
    } 

    public Book getBook(int id) { 

     // 1. get reference to readable DB 
     SQLiteDatabase db = this.getReadableDatabase(); 

     // 2. build query 
     Cursor cursor = db.query(TABLE_BOOKS, // a. table 
       COLUMNS, // b. column names 
       " id = ?", // c. selections 
       new String[] { String.valueOf(id) }, // d. selections args 
       null, // e. group by 
       null, // f. having 
       null, // g. order by 
       null); // h. limit 

     // 3. if we got results get the first one 
     if (cursor != null) 
      cursor.moveToFirst(); 

     // 4. build book object 
     Book book = new Book(); 
     book.setId(Integer.parseInt(cursor.getString(0))); 
     book.setTitle(cursor.getString(1)); 
     book.setAuthor(cursor.getString(2)); 

     Log.d("getBook(" + id + ")", book.toString()); 

     // 5. return book 
     return book; 
    } 

    // Get All Books 
    public List<Book> getAllBooks() { 
     List<Book> books = new LinkedList<Book>(); 

     // 1. build the query 
     String query = "SELECT * FROM " + TABLE_BOOKS; 

     // 2. get reference to writable DB 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(query, null); 

     // 3. go over each row, build book and add it to list 
     Book book = null; 
     if (cursor.moveToFirst()) { 
      do { 
       book = new Book(); 
       book.setId(Integer.parseInt(cursor.getString(0))); 
       book.setTitle(cursor.getString(1)); 
       book.setAuthor(cursor.getString(2)); 

       // Add book to books 
       books.add(book); 
      } while (cursor.moveToNext()); 
     } 

     Log.d("getAllBooks()", books.toString()); 

     // return books 
     return books; 
    } 

    // Updating single book 
    public int updateBook(Book book) { 

     // 1. get reference to writable DB 
     SQLiteDatabase db = this.getWritableDatabase(); 

     // 2. create ContentValues to add key "column"/value 
     ContentValues values = new ContentValues(); 
     values.put("title", book.getTitle()); // get title 
     values.put("author", book.getAuthor()); // get author 

     // 3. updating row 
     int i = db.update(TABLE_BOOKS, // table 
       values, // column/value 
       KEY_ID + " = ?", // selections 
       new String[] { String.valueOf(book.getId()) }); // selection 
                   // args 

     // 4. close 
     db.close(); 

     return i; 

    } 

    // Deleting single book 
    public void deleteBook(Book book) { 

     // 1. get reference to writable DB 
     SQLiteDatabase db = this.getWritableDatabase(); 

     // 2. delete 
     db.delete(TABLE_BOOKS, KEY_ID + " = ?", new String[] { String.valueOf(book.getId()) }); 

     // 3. close 
     db.close(); 

     Log.d("deleteBook", book.toString()); 

    } 

} 

MainActivity.java:

public class MainActivity extends Activity { 

    private ListView obj; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     DataBaseHelper db = new DataBaseHelper(this); 
     db = new DataBaseHelper(this); 


     try { 

      db.createDataBase(); 

     } catch (IOException ioe) { 

      throw new Error("Unable to create database"); 

     } 

     try { 

      db.openDataBase(); 

     } catch (SQLException sqle) { 

      throw sqle; 

     } 

     /* 
     * db.addBook(new Book("Android Application Development Cookbook", 
     * "Wei Meng Lee")); db.addBook(new Book(
     * "Android Programming: The Big Nerd Ranch Guide", 
     * "Bill Phillips and Brian Hardy")); db.addBook(new Book(
     * "Learn Android App Development", "Wallace Jackson")); 
     * 
     * 
     * // get all books List<Book> list = db.getAllBooks(); 
     * 
     * // delete one book db.deleteBook(list.get(0)); 
     * 
     * // get all books db.getAllBooks(); 
     */ 

     obj = (ListView) findViewById(R.id.listView1); 

     List<Book> array_list = db.getAllBooks(); 

     ArrayAdapter<Book> arrayAdapter = new ArrayAdapter<Book>(this, android.R.layout.simple_list_item_1, array_list); 

     obj.setAdapter(arrayAdapter); 

     db.close(); 

    } 

PS:それが役立つかどう私はBookクラスを公開することができます!

+0

これには2つの方法があります。 。手動またはヘルプまたはSQLiteAssetHelperを使用します。手動で試しているようですね。あなたのデータベースはどこにありますか?これはmain/assets/database.dbにあるはずです –

+0

あなたはSQLiteAssetHelper(リンクが助けることができます)を使って私の手助けをすることができます、私の前もってデータベースはフォルダにあります:assets in:workspace/myapp/assets –

+0

[This ](https://github.com/jgilfelt/android-sqlite-asset-helper)。間違いなく手動で試してみてください。 –

答えて

0

問題は資産フォルダにあった、それはそのようにする必要があります

資産/データベース/

私はそれを動作その後、データベースフォルダを追加しました:D

関連する問題