0

好吧,这是我的 DatabaseHelper 类

public class DatabaseHelper extends SQLiteOpenHelper {

    static final String dbName="demoDB";

    public DatabaseHelper(Context context) {
            super(context, dbName, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
            String sql = "CREATE TABLE IF NOT EXISTS players (" +
                                            "id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
                                            "playerName TEXT)";
            db.execSQL(sql);

            ContentValues values = new ContentValues();

            values.put("playerName", "John");
            db.insert("players", "playerName", values);

            values.put("playerName", "George");
            db.insert("players", "playerName", values);

            values.put("firstName", "Marie");
            db.insert("players", "playerName", values);
            System.out.println("Hello");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS players");
            onCreate(db);
    }

}

在我的主要活动中,这就是我获取数据的方法。

if (cursor!= null) {
            if (cursor.moveToFirst()) {
                do {
                     System.out.println(cursor.getString(cursor.getColumnIndexOrThrow("playerName")));            
                } while (cursor.moveToNext());
            }
        }

为什么没有创建列?我得到了这个例外。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mkyong.android/com.mkyong.android.Stats}: java.lang.IllegalArgumentException: column 'playerName' does not exist
4

1 回答 1

1

在与光标交互之前您是否选择了任何内容?您的光标应该是“选择...”SQL 调用的结果,但我在 DatabaseHelper 或 MainActivity 中没有看到任何表明您正在进行任何类型的选择的光标。

此外,当您向表中插入值时,我相信第二个参数应该是 null [ db.insert("players", null, values)]。它适用于nullColumnHack,如果您没有在行中输入任何数据,您可以使用它。

nullColumnHack  optional; may be null. SQL doesn't allow inserting a completely empty row without naming at least one column name. If your provided values is empty, no column names are known and an empty row can't be inserted. If not set to null, the nullColumnHack parameter provides the name of nullable column name to explicitly insert a NULL into in the case where your values is empty. 

编辑

好吧,到目前为止,您已经创建了一个表并插入了一些记录。下一步是创建基本的 CRUD 操作(创建、检索、更新、删除),但对于您的情况,您需要从检索开始。

检索基本上意味着您正在从数据库中读取/检索数据,因此您可以在应用程序中使用它。当您从数据库读取数据时,它会存储在光标中。因此,您需要:

  1. 在你的数据库助手中创建一个方法来从你的数据库中读取数据
  2. 在您的主要活动中,调用您在步骤 #1 中创建的方法。结果存储在游标中。
  3. 在您的主要方法中,从光标中提取数据以便您可以使用它。(看起来你已经在你的主要活动中尝试过这个)。

这是一个关于设置数据库以及如何为数据库创建 CRUD 操作的精彩教程的链接。现在,向下滚动并阅读检索操作。 http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

如果我是你,我会阅读整个教程。现在还有许多其他有用的提示和建议非常值得投资。例如,在 DatabaseHelper 类中为表名、数据库名、列名创建常量是一个非常好的主意,因为如果您继续手动输入所有列名和表名,迟早会出现拼写错误。如果您使用变量,您将在运行时收到编译错误而不是异常。

于 2012-08-14T15:58:52.510 回答