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

我认为您在创建句子时出错(正如 Gunaseelan 所说),因此未创建 client_table。修改创建字符串后,您需要调用 DatabaseOpenHelper onCreate 或 onUpgrade 函数。

仅当数据库不存在时才调用 OnCreate 。如果您删除数据库,下次打开它时会再次创建它。

OnUpgrade 在数据库版本更改时调用。要调用它,请使用:

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

如您所见,我更改了数据库版本。这应该会触发 onUpgrade 函数以再次创建表。

无论您使用什么选项,请查看日志以检查创建表时是否有任何错误。

于 2013-06-11T11:58:31.727 回答