2

2 つのアクティビティを持つアプリケーションを作成しようとしています。それぞれ別のテーブルを使用し、テーブルの内容を取得してリスト ビューに表示します。

これまでのところ、最初のアクティビティは person_table にアクセスでき、そのテーブル内のすべてのものを表示できますが、クライアント アクティビティを起動しようとするとエラーが発生します。

  sqlite returned: error code = 1, msg = no such table: client_table.

助けが必要です

package com.rich.myfinal;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

android.util.Log;

public class PersonDataHelper extends Activity {

    private static final String TAG = PersonDataHelper.class.getSimpleName();

    // database configuration
    // if you want the onUpgrade to run then change the database_version
    private static final String DATABASE_NAME = "mydatabase.db";

    // table configuration
    private static final String TABLE_NAME = "person_table";         // Table name
    private static final String TABLE_NAME1 = "client_table";         // Table name
    private static final String PERSON_TABLE_COLUMN_ID = "_id";     // a column named "_id" is required for cursor
    private static final String PERSON_TABLE_COLUMN_NAME = "person_name";
    private static final String PERSON_TABLE_COLUMN_PIN = "person_pin";

    private DatabaseOpenHelper openHelper;
    private SQLiteDatabase database;

    // this is a wrapper class. that means, from outside world, anyone will communicate with PersonDatabaseHelper,
    // but under the hood actually DatabaseOpenHelper class will perform database CRUD operations
    public PersonDataHelper(Context aContext) {

        openHelper = new DatabaseOpenHelper(aContext);
        database = openHelper.getWritableDatabase();
    }

    public void insertData (String aPersonName, String aPersonPin) {

        // we are using ContentValues to avoid sql format errors

        ContentValues contentValues = new ContentValues();

        contentValues.put(PERSON_TABLE_COLUMN_NAME, aPersonName);
        contentValues.put(PERSON_TABLE_COLUMN_PIN, aPersonPin);

        database.insert(TABLE_NAME, null, contentValues);
        database.insert(TABLE_NAME1, null, contentValues);
    }

    public Cursor getAllData () {

        String buildSQL = "SELECT * FROM " + TABLE_NAME;

        Log.d(TAG, "getAllData SQL: " + buildSQL);

        return database.rawQuery(buildSQL, null);
    }

    public Cursor getAllDataClient () {

        String buildSQL = "SELECT * FROM " + TABLE_NAME1;

        Log.d(TAG, "getAllDatayyy SQL: " + buildSQL);

        return database.rawQuery(buildSQL, null);
    }

    // this DatabaseOpenHelper class will actually be used to perform database related operation

    private class DatabaseOpenHelper extends SQLiteOpenHelper {

        public DatabaseOpenHelper(Context aContext) {
            super(aContext, DATABASE_NAME, null, 1);
        }

        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            // Create your tables here

            String buildSQL = "CREATE TABLE " + TABLE_NAME + "( " + PERSON_TABLE_COLUMN_ID + " INTEGER PRIMARY KEY, " +
                    PERSON_TABLE_COLUMN_NAME + " TEXT, " + PERSON_TABLE_COLUMN_PIN + " TEXT )";

            String buildSQL2 = "CREATE TABLE IF NOT EXISTS" + TABLE_NAME1 + "( " + PERSON_TABLE_COLUMN_ID + " INTEGER PRIMARY KEY, " +
                    PERSON_TABLE_COLUMN_NAME + " TEXT, " + PERSON_TABLE_COLUMN_PIN + " TEXT )";

            Log.d(TAG, "onCreate SQL: " + buildSQL+buildSQL2);

            sqLiteDatabase.execSQL(buildSQL);
            sqLiteDatabase.execSQL(buildSQL2);
        }

        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
            // Database schema upgrade code goes here

            String buildSQL = "DROP TABLE IF EXISTS " + TABLE_NAME;
            String buildSQL2 = "DROP TABLE IF EXISTS " + TABLE_NAME1;

            Log.d(TAG, "onUpgrade SQL: " + buildSQL+buildSQL2);

            sqLiteDatabase.execSQL(buildSQL);       // drop previous table
            sqLiteDatabase.execSQL(buildSQL2);

            onCreate(sqLiteDatabase);               // create the table from the beginning
        }
    }
}

クライアントアクティビティでメソッドを呼び出すとエラーが発生します

new Handler().post(new Runnable() {
            @Override
            public void run() {
                customAdapter = new CustomCursorAdapter(ClientActivity.this, databaseHelper.getAllDataClient());
                listView.setAdapter(customAdapter);
            }
        });
    }
4

1 に答える 1

0

(グナシーランが言ったように) 作成文にエラーがあったと思うので、client_table は作成されませんでした。作成文字列を変更したら、DatabaseOpenHelper の onCreate または onUpgrade 関数を呼び出す必要があります。

OnCreate は、データベースが存在しない場合にのみ呼び出されます。データベースを削除すると、次に開いたときに再び作成されます。

OnUpgrade は、データベースのバージョンが変更されたときに呼び出されます。これを呼び出すには、次のようにします。

    public DatabaseOpenHelper(Context aContext) {
        super(aContext, DATABASE_NAME, null, 2);
    }

ご覧のとおり、データベースのバージョンを変更しました。これにより、 onUpgrade 関数がトリガーされ、テーブルが再度作成されます。

どのオプションを使用する場合でも、ログを見て、テーブルの作成中にエラーが発生していないかどうかを確認してください。

于 2013-06-11T11:58:31.727 に答える