Sqlite返回:错误代码= 1,msg =没有这样的表:client_table

时间:2013-06-11 11:38:55

标签: android sqlite

我正在尝试编写一个包含两个活动的应用程序。每个使用一个单独的表并获取表中的内容并将其显示在列表视图中。

到目前为止,第一个活动可以访问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);
            }
        });
    }

1 个答案:

答案 0 :(得分:0)

我认为你在创建句子中有错误(如Gunaseelan所说),因此没有创建client_table。修改创建字符串后,需要调用DatabaseOpenHelper onCreate或onUpgrade函数。

如果数据库不存在,则仅将OnCreate称为 。如果删除数据库,下次打开它时将再次创建它。

在数据库版本更改时调用OnUpgrade。要打电话给它:

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

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

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