在Android SQLite更正中创建表语法

时间:2012-02-21 20:22:35

标签: android sqlite

抱歉,由于工作,我不得不删除我之前的帖子。 。这是对我遇到的问题的更通用的修复,它没有特别引用任何东西,但更像是如何使用我给出的解决方案完成它的框架。

/// --------------------此帖最近的编辑------------------ ----------------

好的家伙和女孩们,我的语法没有错误,但我的方法并不是最聪明的。对于那些需要解决方案的人来说,我是如何正确地做到这一点的,这是用于在android的单个数据库中创建多个表(至少我做的方式。).......

好的,清除dbAdapters中嵌入的所有dbHelper类,并创建一个扩展SQLiteOpenHelper的独立dbhelper类。通过这样做,您可以使用类来访问信息,同时引用SliteOpenHelper独立的dbAdapter。下面是Stand alone helper类和我用来访问它的一个适配器的示例。

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class DatabaseHelper extends SQLiteOpenHelper
{
//-----------------------------------Member Variables---------------------------
    private static final String DATABASE_NAME = "databaseName";
    private static final int DATABASE_VERSION = 1;
//----------------------------------------------------------------------

    DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        // nothing here cause not upgrading version right now
        Log.w(DatabaseHelper.class.getName(),
            "Upgrading database from version " + oldVersion + " to "
            + newVersion + ", which will destroy all old data");

    db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME  + Table1DbAdapter.DATABASE_TABLE);
    db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME  + Table2DbAdapter.DATABASE_TABLE);

        onCreate(db);
    }
    @Override
    public void onCreate(SQLiteDatabase db)
    {

        db.execSQL(Table1DbAdapter.CREATE_TABLE_ONE);
        db.execSQL(Table2DbAdapter.CREATE_TABLE_TWO);

    }

}

//以及如何从访问table1的类中使用此帮助程序的一个示例(对所有其他表执行相同的方式)

public class Table1DbAdapter {


static final String DATABASE_TABLE = "table1";


public static final String KEY_TITLE = "title";
public static final String KEY_BODY = "body";
public static final String KEY_ROWID = "_id";

private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;


 static final String CREATE_TABLE_ONE =
            "create table " + DATABASE_TABLE + "("
            + KEY_ROWID + " integer primary key autoincrement, "
            + KEY_TITLE + " text not null, "
            + KEY_BODY + " text not null )";


private final Context mCtx;

public Table1DbAdapter(Context ctx) {
    this.mCtx = ctx;
}

// create the database
public Table1DbAdapter open() throws android.database.SQLException{
    this.mDbHelper = new DatabaseHelper(mCtx);
    this.mDb = mDbHelper.getWritableDatabase();
    return this;
}

// create an entry
public long createEntry(String title, String body){
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_TITLE, title);
    initialValues.put(KEY_BODY, body);

    return 
        this.mDb.insert(DATABASE_TABLE, null, initialValues);
}
// delete an Entry
public boolean deleteEntry(long rowId){
    return 
        this.mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" +rowId, null) > 0;
}
// fetch all Entries
public Cursor fetchAllEntries(){
    return this.mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, 
                    KEY_BODY}, null, null, null, null, null);
    }
// fetch an Entry
public Cursor fetchEntry(long rowId) throws SQLException{
    Cursor mCursor = 
    mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, 
                    KEY_BODY}, KEY_ROWID +"="+ 
                        rowId, null, null, null, null, null);
    if (mCursor != null){
        mCursor.moveToFirst();
    }
    return mCursor;
}
// update an Entry
public boolean updateEntry(long rowId, String title, String body){
    ContentValues args = new ContentValues();
    args.put(KEY_TITLE, title);
    args.put(KEY_BODY, body);

    return
    this.mDb.update(DATABASE_TABLE, args, KEY_ROWID + "="+ rowId, null)> 0;

}
// close the database
public void close(){
    mDbHelper.close();
}

}

//我希望这会有所帮助....对于早些时候的删除再次感到遗憾,但这是应该如何完成的。 。 。至少在我找到更有效的方法之前

3 个答案:

答案 0 :(得分:1)

了解SQLite语法的最佳来源是SQLite Homepage

你的语法看起来是正确的。

编辑:是的,您需要从app文件夹中删除数据库,并让应用程序为您创建一个新数据库,就像评论中建议您做的那样。因为onCreate()方法检查数据库是否存在,如果没有,则创建一个新的。

您可以通过在Eclipse中使用DDMS来删除数据库。数据库通常存储在

/data/data/your.applications.package/databases

答案 1 :(得分:1)

看起来您的数据库存在,但您的表(设施)却没有。

因此,永远不会调用onCreate(),因为数据库已经存在。

随后运行SELECT查询时,它会抛出异常。

我很确定如果您使用调试器并逐步执行代码,您会看到这种情况发生。

解决方案

  • 从设备中删除数据库或
  • 直接从sqlite3
  • 执行您的CREATE TABLE语句

答案 2 :(得分:1)

好的,没有冒犯,但你的方法确实需要一些工作。那段代码是完全纠结的。

至于解释异常的原因......

在该代码中,从未创建MainDbAdapter的实例。结果是,它的onCreate(...)方法永远不会被调用,所以基本上你没有任何表(所有这些表,我的意思是,不仅仅缺少设施表)。

老实说,我不会将派生的SQLiteOpenHelper嵌套到任何类型的“适配器”中。

创建一个扩展SQLiteOpenHelper的独立类,只需在需要时创建它的实例。

摆脱“适配器”类中的嵌套DatabaseHelper类,重新构建,查看eclipse抱怨的内容(假设您正在使用eclipse)然后通过将所有内容指向您的站点来修补它 - SQLiteOpenHelper