2012-04-11 16 views
1

SQLデータベースについて何十億ものスレッドがあることは知っていますが、私の問題を解決する方法は見つかりませんでした。 私はBeer Or No Beerという名前のアプリを作っており、ビールのブランドとその国のArraylistが必要です。今、私はこのリストをSQLiteで管理したいと思っています。 SQLite Database Browserを使用してデータベースを作成し、そのデータベースをassetsフォルダ(名前:sqbeerlist)にコピーしました。 これでファイルを開き、ファイルをarraylistに書き込むためにDatabaseHelperクラスを作成しました。 私はAndroid SQLデータベース - rawQuery()ソースが見つかりません

 Cursor c = myDataBase.rawQuery("SELECT _id, brand FROM " + DATABASE_TABLE, null); 

DVMがクラッシュして行をアクセスもしたいし、それがソースが見つかりませんと言うとき。私は間違って何をしているのですか?ここ

は全体helperClassのです:

DataBaseHelper myDbHelper = new DataBaseHelper(null); 
    myDbHelper = new DataBaseHelper(this); 

    try { 
     myDbHelper.createDataBase(); 

} catch (IOException ioe) { 

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

} 

      ArrayList<String> thelist = myDbHelper.gettheArray(); 

はありがとうと私は誰かが(役立つことを願って:

===

package com.celticwolf.alex; 

    import java.io.FileOutputStream; 

    import java.io.IOException; 

    import java.io.InputStream; 

    import java.io.OutputStream; 

    import java.util.ArrayList; 

    import android.content.Context; 

    import android.database.Cursor; 

    import android.database.SQLException; 

    import android.database.sqlite.SQLiteDatabase; 

    import android.database.sqlite.SQLiteDatabase.CursorFactory; 

    import android.database.sqlite.SQLiteException; 

    import android.database.sqlite.SQLiteOpenHelper; 

    public class DataBaseHelper extends SQLiteOpenHelper { 

    // The Androids default system path of your application database. 

    private static String DB_PATH = "/data/data/com.celticwolf.alex/databases/"; 

    private static String DB_NAME = "sqbeerlist"; 

    private static final String DATABASE_TABLE = "beers"; 

    private SQLiteDatabase myDataBase; 

    public static final String KEY_ROWID = "_id"; 

    public static final String KEY_NAME = "brand"; 

    public static final String KEY_COUNTRY = "country"; 

    private final Context myContext; 

    public DataBaseHelper(Context context) { 

     super(context, DB_NAME, null, 1); 

     this.myContext = context; 

    } 

    /** 
    * 
    * Creates a empty database on the system and rewrites it with your own 
    * 
    * database. 
    * 
    * */ 

    public void createDataBase() throws IOException { 

     boolean dbExist = checkDataBase(); 

     if (dbExist) { 

      // do nothing - database already exist 

     } else { 

      // By calling this method and empty database will be created into 

      // the default system path 

      // of your application so we are gonna be able to overwrite that 

      // database with our database. 

      this.getReadableDatabase(); 

      try { 

       copyDataBase(); 

      } catch (IOException e) { 

       throw new Error("Error copying database"); 

      } 

     } 

    } 

    /** 
    * 
    * Check if the database already exist to avoid re-copying the file each 
    * 
    * time you open the application. 
    * 
    * 
    * 
    * @return true if it exists, false if it doesnt 
    */ 

    private boolean checkDataBase() { 

     SQLiteDatabase checkDB = null; 

     try { 

      String myPath = DB_PATH + DB_NAME; 

      checkDB = SQLiteDatabase.openDatabase(myPath, null, 

      SQLiteDatabase.OPEN_READONLY); 

     } catch (SQLiteException e) { 

      // database doest exist yet. 

     } 

     if (checkDB != null) { 

      checkDB.close(); 

     } 

     return checkDB != null ? true : false; 

    } 

    /** 
    * 
    * Copies your database from your local assets-folder to the just created 
    * 
    * empty database in the system folder, from where it can be accessed and 
    * 
    * handled. This is done by transfering bytestream. 
    * 
    * */ 

    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); 

     // transfer bytes from the inputfile to the 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 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(); 

    } 

    public ArrayList gettheArray() { 

     ArrayList result = new ArrayList(); 

     try { 

      openDataBase(); 

     }catch(SQLException sqle){ 

      throw sqle; 

     } 

     Cursor c = myDataBase.rawQuery("SELECT _id, brand FROM " + DATABASE_TABLE, null); 

     c.moveToFirst(); 

     // Check if our result was valid. 

     if (c != null) { 

      // Loop through all Results 

      do { 

       result.add(c.getString(c.getColumnIndex(KEY_NAME))); 

      } while (c.moveToNext()); 

     } 

     close(); 

     return result; 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 

    // Add your public helper methods to access and get content from the 

    // database. 

    // You could return cursors by doing "return myDataBase.query(....)" so it'd 

    // be easy 

    // to you to create adapters for your views. 

} 

そして、ここでは、私はクラスにアクセスする方法であります========================================== ====================== 問題が解決しました! 正しいコードはありますか? C言語== 3

 
    package com.celticwolf.alex; 

    import java.io.FileOutputStream; 

    import java.io.IOException; 

    import java.io.InputStream; 

    import java.io.OutputStream; 

    import java.util.ArrayList; 

    import android.content.Context; 

    import android.database.Cursor; 

    import android.database.SQLException; 

    import android.database.sqlite.SQLiteDatabase; 

    import android.database.sqlite.SQLiteDatabase.CursorFactory; 

    import android.database.sqlite.SQLiteException; 

    import android.database.sqlite.SQLiteOpenHelper; 

    public class DataBaseHelper extends SQLiteOpenHelper { 

    // The Android's default system path of your application database. 

    private static String DB_PATH = "/data/data/com.celticwolf.alex/databases/"; 

    private static String DB_NAME = "sqbeerlist.sqlite"; 

    private static final String DATABASE_TABLE = "beers"; 

    private SQLiteDatabase myDataBase; 

    public static final String KEY_ROWID = "_id"; 

    public static final String KEY_NAME = "brand"; 

    public static final String KEY_COUNTRY = "country"; 

    private final Context myContext; 

    public DataBaseHelper(Context context) { 

     super(context, DB_NAME, null, 1); 

     this.myContext = context; 

    } 

    /** 
    * 
    * Creates a empty database on the system and rewrites it with your own 
    * 
    * database. 
    * 
    * */ 

    public void createDataBase() throws IOException { 

     boolean dbExist = checkDataBase(); 
     SQLiteDatabase db_Read = null; // c==3 

     if (dbExist) { 

      // do nothing - database already exist 

     } else { 

      // By calling this method and empty database will be created into 
      // the default system path 
      // of your application so we are gonna be able to overwrite that 
      // database with our database. 

      db_Read = this.getReadableDatabase(); // c==3 
      db_Read.close(); // c==3 

      try { 

       copyDataBase(); 

      } catch (IOException e) { 

       throw new Error("Error copying database"); 

      } 

     } 

    } 

    /** 
    * 
    * Check if the database already exist to avoid re-copying the file each 
    * 
    * time you open the application. 
    * 
    * 
    * 
    * @return true if it exists, false if it doesnt 
    */ 

    private boolean checkDataBase() { 

     SQLiteDatabase checkDB = null; 

     try { 

      String myPath = DB_PATH + DB_NAME; 

      checkDB = SQLiteDatabase.openDatabase(myPath, null, 
        (SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS)); // c==3 

     } catch (SQLiteException e) { 

      // database doesnt exist yet. 

     } 

     if (checkDB != null) { 

      checkDB.close(); 

     } 

     return checkDB != null ? true : false; 

    } 

    /** 
    * 
    * Copies your database from your local assets-folder to the just created 
    * 
    * empty database in the system folder, from where it can be accessed and 
    * 
    * handled. This is done by transfering bytestream. 
    * 
    * */ 

    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); 

     // transfer bytes from the inputfile to the 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 openDataBase() throws SQLException { 

     // Open the database 

     String myPath = DB_PATH + DB_NAME; 

     myDataBase = SQLiteDatabase.openDatabase(myPath, null, (SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS)); // c==3 

    } 

    @Override 
    public synchronized void close() { 

     if (myDataBase != null) 

      myDataBase.close(); 

     super.close(); 

    } 

    public ArrayList gettheArray() { 

     ArrayList result = new ArrayList(); 

     try { 

      openDataBase(); 

     }catch(SQLException sqle){ 

      throw sqle; 

     } 

     Cursor c = myDataBase.rawQuery("SELECT _id, brand FROM " + DATABASE_TABLE, null); 

     c.moveToFirst(); 

     // Check if our result was valid. 

     if (c != null) { 

      // Loop through all Results 

      do { 

       result.add(c.getString(c.getColumnIndex(KEY_NAME))); 

      } while (c.moveToNext()); 
     } 
     close(); 
     return result; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
    } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 
    // Add your public helper methods to access and get content from the 
    // database. 
    // You could return cursors by doing "return myDataBase.query(....)" so itd 
    // be easy 
    // to you to create adapters for your views. 
} 

答えて

2

私が最初に渡ってデータベースをコピーしていくつかの時間前にこの問題を持っていた:この記号は、変更をマークします。

私はアプリの初回起動時にcsv形式で(資産または生で)リソースを使用して、最初からデータベースを作成することになった(もちろん、これは少しより多くのスペースを取る場合があります)

this threadを見て、それが役立つかどうかを見てください。

+0

がすっごくありがとうございましたあなたの問題を解決する必要があります願っています! Waqasソリューションと一緒にこのスレッドは、私の問題を正確に解決!驚くばかり!正しいクラスを上に載せてください。 – LxSwiss

2

SQLiteDatabase.NO_LOCALIZED_COLLATORSでデータベースを開く必要があります。なぜなら、アンドロイドからデータベースを作成すると、アンドロイドフレームワークで必要なテーブルandroid_metadataが含まれていないからです。だから、

、以下のようにデータベースを開く:

checkDB = SQLiteDatabase.openDatabase(myPath, null, 
     (SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS)); 

はそれが

+0

いいえ..問題を解決しませんでした。たとえ私がmyDataBase = SQLiteDatabase.openDatabase(myPath、null、(SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS))に同じことを行ったとしても、 – LxSwiss

+0

ありがとうございました!あなたのソリューションはSteve_kのソリューションと一緒に問題を解決しました!私は正しいコードを上に掲示します。 – LxSwiss

関連する問題