0

TEstTableSQLiteManager を使用して 1 つのテーブルを含むデータベース ファイル (.db) を作成し、 /assetsフォルダーに貼り付けました。Android アプリケーションからこのデータベースに対してアクションを実行したいと考えています。

そのために、Stack Overflow で推奨されているこのチュートリアルに従いました。

それを読み取って結果を文字列に保存し、その結果を出力するためのコードをもう少し追加しました。正確には、rawquery のみを追加しました。

DatabaseHelper クラスのコードを確認してください。

public class DatabaseHelper extends SQLiteOpenHelper {
    //The Android's default system path of your application database.
    private static final String DB_PATH = "/data/data/com.example.sqlitemanagerexample/databases/";

    private static final String DB_NAME = "managerSample";

    private SQLiteDatabase myDataBase;

    private final Context myContext;

    /**
     * Constructor Takes and keeps a reference of the passed context in order to
     * access to the application assets and resources.
     * 
     * @param context
     */
    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 doesn't
     */
    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 does't 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();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

    }

    public String getEntries() {

            Cursor c = myDataBase.rawQuery("SELECT * FROM TestTable ;", null);
            String result = "";
            for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
                    result = result + c.getShort(0) + c.getString(1) + c.getString(2);

            }
            return result;

    }

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

}

View Activity のコード:

public class View extends Activity {

    TextView tv;

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.viewdb);
            tv = (TextView) findViewById(R.id.textView1);

            DatabaseHelper myDbHelper ;
            myDbHelper = new DatabaseHelper(this);

            try {

                    myDbHelper.createDataBase();

            } catch (IOException ioe) {

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

            }

            try {

                    myDbHelper.openDataBase();

            } catch (SQLException sqle) {

                    throw sqle;

            }



            tv.setText(myDbHelper.getEntries());

    }
}

このコードを実行すると、ビュー アクティビティが開始されず、アプリケーションが強制的に閉じられます。Logcat は次のように述べています。

E/AndroidRuntime(1764): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sqlitemanagerexample/com.example.sqlitemanagerexample.View}: android.database.sqlite.SQLiteException: no such table: TestTable: , whileコンパイル: SELECT * FROM TestTable ;
android.database.sqlite.SQLiteException: そのようなテーブルはありません: TestTable: 、コンパイル中: SELECT * FROM TestTable ;

4

2 に答える 2

0

データベースを確認してください。テーブルTestTableが存在する場合は、アクティビティから呼び出されたgetEntriesメソッドのselectステートメントが原因でエラーが発生するためです。ログから投稿したエラーは、そのようなテーブルが存在しないことを示しています。

于 2012-08-06T07:58:35.487 に答える
0

データベースの名前 (assests フォルダーに存在する) を確認します。コードに次の行があるため、 " managerSample " である必要があります。

private static final String DB_NAME = "managerSample"; 

編集

これはあなたを助けるかもしれません

于 2012-08-06T09:19:14.567 に答える