1

我已经尝试了将近一个星期来创建一个包含多个表的 SQLite 数据库,但没有成功。我已经搜索了几个小时并查看了有关该主题的所有主题here,但我不知道我做错了什么。

这是我从互联网上获得的用于一张桌子的代码,我刚刚添加了另一张桌子,它不再起作用了。

适配器:

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

public class WorkingAdapter {

    public static final String WORKINGDATABASE_NAME = "WORKING_DATABASE";
    public static final String WORKINGDATABASE_TABLE = "WORKING_TABLE";
    public static final int MYDATABASE_VERSION = 1;
    public static final String KEY_ID = "_id";
    public static final String KEY_CONTENT = "Content";

    //create table MY_DATABASE (ID integer primary key, Content text not null);
    private static final String SCRIPT_CREATE_WORKING_DATABASE =
        "create table " + WORKINGDATABASE_TABLE + " ("
        + KEY_ID + " integer primary key autoincrement, "
        + KEY_CONTENT + " text not null);";

    public static final String WORKINGDATABASE_TABLE2 = "MY_TABLE2";
    public static final String KEY_ID2 = "_id2";
    public static final String KEY_CONTENT2 = "Content2";

    //create table MY_DATABASE (ID integer primary key, Content text not null);
    private static final String SCRIPT_CREATE_WORKING_DATABASE2 =
        "create table " + WORKINGDATABASE_TABLE2 + " ("
        + KEY_ID2 + " integer primary key autoincrement, "
        + KEY_CONTENT2 + " text not null);";

    private SQLiteHelper sqLiteHelper;
    private SQLiteDatabase sqLiteDatabase;

    private Context context;

    public WorkingAdapter(Context c){
        context = c;
    }

    public WorkingAdapter openToRead() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, WORKINGDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getReadableDatabase();
        return this;    
    }

    public WorkingAdapter openToWrite() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, WORKINGDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getWritableDatabase();
        return this;    
    }

    public void close(){
        sqLiteHelper.close();
    }

    public long insert(String content){

        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_CONTENT, content);
        return sqLiteDatabase.insert(WORKINGDATABASE_TABLE, null, contentValues);
    }

public long insert2(String content){

        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_CONTENT2, content);
        return sqLiteDatabase.insert(WORKINGDATABASE_TABLE2, null, contentValues);
    }

    public int deleteAll(){
        return sqLiteDatabase.delete(WORKINGDATABASE_TABLE, null, null);
    }

    public Cursor queueAll(){
        String[] columns = new String[]{KEY_ID, KEY_CONTENT};
        Cursor cursor = sqLiteDatabase.query(WORKINGDATABASE_TABLE, columns, 
                null, null, null, null, null);

        return cursor;
    }

    public Cursor queueAll2(){
        String[] columns = new String[]{KEY_ID2, KEY_CONTENT2};
        Cursor cursor = sqLiteDatabase.query(WORKINGDATABASE_TABLE2, columns, 
                null, null, null, null, null);

        return cursor;
    }

    public class SQLiteHelper extends SQLiteOpenHelper {

        public SQLiteHelper(Context context, String name,
                CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(SCRIPT_CREATE_WORKING_DATABASE);
            db.execSQL(SCRIPT_CREATE_WORKING_DATABASE2);

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXISTS " + WORKINGDATABASE_TABLE);
            db.execSQL("DROP TABLE IF EXISTS " + WORKINGDATABASE_TABLE2);
            onCreate(db);
        }

    }

}

活动:

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class AndroidSQLite extends Activity {

    private WorkingAdapter myWorkingAdapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ListView listContent = (ListView)findViewById(R.id.contentlist);

        /*
         *  Create/Open a SQLite database
         *  and fill with dummy content
         *  and close it
         */
        myWorkingAdapter = new WorkingAdapter(this);
        myWorkingAdapter.openToWrite();
        myWorkingAdapter.deleteAll();

        myWorkingAdapter.insert("A for Apply");
        myWorkingAdapter.insert("B for Boy");
        myWorkingAdapter.insert("C for Cat");
        myWorkingAdapter.insert("D for Dog");
        myWorkingAdapter.insert("E for Egg");
        myWorkingAdapter.insert("F for Fish");
        myWorkingAdapter.insert("G for Girl");
        myWorkingAdapter.insert("H for Hand");
        myWorkingAdapter.insert("I for Ice-scream");
        myWorkingAdapter.insert("J for Jet");
        myWorkingAdapter.insert("K for Kite");
        myWorkingAdapter.insert("L for Lamp");
        myWorkingAdapter.insert("M for Man");
        myWorkingAdapter.insert("N for Nose");
        myWorkingAdapter.insert("O for Orange");
        myWorkingAdapter.insert("P for Pen");
        myWorkingAdapter.insert("Q for Queen");
        myWorkingAdapter.insert("R for Rain");
        myWorkingAdapter.insert("S for Sugar");
        myWorkingAdapter.insert("T for Tree");
        myWorkingAdapter.insert("U for Umbrella");
        myWorkingAdapter.insert("V for Van");
        myWorkingAdapter.insert("W for Water");
        myWorkingAdapter.insert("X for X'mas");
        myWorkingAdapter.insert("Y for Yellow");
        myWorkingAdapter.insert("Z for Zoo");

        myWorkingAdapter.insert2("W FOR WORKING");

        myWorkingAdapter.close();

        /*
         *  Open the same SQLite database
         *  and read all it's content.
         */
        myWorkingAdapter = new WorkingAdapter(this);
        myWorkingAdapter.openToRead();

        Cursor cursor = myWorkingAdapter.queueAll2();
        startManagingCursor(cursor);

        String[] from = new String[]{WorkingAdapter.KEY_CONTENT};
        int[] to = new int[]{R.id.text};

        SimpleCursorAdapter cursorAdapter =
            new SimpleCursorAdapter(this, R.layout.row, cursor, from, to);

        listContent.setAdapter(cursorAdapter);

        myWorkingAdapter.close();


    }
}

我一直在寻找具有多个表的 SQLite 数据库的示例,但没有一个有效,并且完全按照我在该主题上找到的所有页面中阅读的内容进行操作,您能告诉我我做错了什么吗?

谢谢 :)

4

4 回答 4

1

改变

public static final int MYDATABASE_VERSION = 1;

public static final int MYDATABASE_VERSION = 2;

并且每次您更改数据库更改递增时,它都会触发 onUpgrade 递减,它将触发 onDowngrade (如果您需要这样做并且您当然会覆盖它)

您可以从android 开发人员资源中阅读有关构造函数的更多信息

于 2012-07-03T14:44:51.917 回答
0

_id是表中的特殊列SQLLite。它是每个表的主键,如果我没记错的话,如果你不定义它,它将自动创建。我怀疑您将其更改为以_id2某种方式引起问题。所以改回来:

public static final String KEY_ID2 = "_id";

并尝试这样。

另请注意,(就像现在一样)您的应用程序将在每次运行时尝试创建表。因此,如果它在第一次运行时创建了第一个表但未能创建第二个表并且您修复了错误并再次运行您的应用程序,这一次它将无法创建第一个表,因为它已经创建。因此,为避免这些问题,请确保您进行全新安装并正确处理数据库版本控制。

于 2012-07-03T14:41:17.567 回答
0

要尝试的事情:

  1. SimpleCursorAdapter需要_id在其Cursor. 如果Cursor不包含名为 的列_id,则会引发异常。

    _id2回以_id解决此问题。

  2. 每次运行(更新的)应用程序时转到Settings--> Apps--> [your app]--> 。Clear data这很重要,因为您希望 100% 确定每次运行应用程序时都使用全新的状态。

  3. 使用 aListActivity而不是Activity. 这使您的生活更轻松(不必ListView直接处理)并可能减少出错的可能性。确保你打电话setListAdapter(adapter)onCreate

  4. 不要使用startManagingCursor...它已被弃用为 Android 3.0。您应该使用Android 3.0CursorLoader中引入的 s 和LoaderManager(并在兼容性包中支持回 Android 1.6)。

  5. 不要创建多个WorkingAdapter实例(或其他)。这只会让你的代码更混乱,并且更有可能因为SQLiteDatabase忘记关闭它而泄露你的代码。您可以在此处阅读有关此内容的更多信息:

    如何使我的 SQLiteDatabase 成为单例?

于 2012-07-03T14:43:07.773 回答
0

Caner 所说的,您也不需要 KEY_CONTENT2 作为“Content2”,列名在表中是唯一的,因此将其命名为“Content”就足够了。

另外,您是否尝试过清除应用程序数据库?转到设置->应用程序->您的应用程序->清除数据。您的数据库可能是在版本 1 中使用旧版本创建的,但您没有指定版本 2,因此不会调用 onUpgrade() 方法。所以要么清除应用程序数据库,要么将数据库版本提高到 2。

于 2012-07-03T14:45:13.047 回答