【问题标题】:Android: SQLite insert, no attemptAndroid:SQLite 插入,没有尝试
【发布时间】:2014-06-25 01:57:11
【问题描述】:

您好,我是整个 android 和 SQLite 数据库的新手。我遇到的问题是当我尝试将分数插入数据库时​​,甚至没有尝试。代码在不插入的情况下继续正常运行。

我的数据库表实际上是主键 id 和分数字段,它是一个整数。

我不完全确定您需要查看哪些代码来识别我的问题,但这是我的猜测。抱歉,如果我错了,我会尽我所能提供帮助。感谢您的宝贵时间。

DBAdaptor 类。

//Primary Key for the score
    public static final String KEY_ROWID = "id";
    //Field for user score
    public static final String KEY_SCORE = "score";

    //Database name
    private static final String DATABASE_NAME = "SportsQuiz";
    //Database table name
    private static final String DATABASE_TABLE = "score";
    //Database version
    private static final int DATABASE_VERSION = 1;

    private dbHelper dbHelper;
    private final Context context;
    private SQLiteDatabase sqlDB;

    private static class dbHelper extends SQLiteOpenHelper
    {
        //Constructor for dbHelper
        public dbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL("CREATE TABLE " + DATABASE_TABLE + " ( " + 
            KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            KEY_SCORE + "INTEGER NOT NULL;)");
        }

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


    } 

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

    public Adapter open() throws SQLException
    {
        dbHelper = new dbHelper(context);
        sqlDB = dbHelper.getWritableDatabase();
        return this;
    }

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

    public long createEntry(int score) {
        // TODO Auto-generated method stub
        ContentValues cv = new ContentValues();
        cv.put(KEY_SCORE, score);
        return sqlDB.insert(DATABASE_TABLE, null, cv);
    }

如果插入成功,我希望在我的游戏类中显示一个对话框。分数是一个 int 变量。

boolean working = true;
                    try{
                        Adapter entry = new Adapter(Game.this);
                        entry.open();
                        entry.createEntry(score);

                        entry.close();
                    }catch (Exception e)
                    {
                        working = false;
                    }
                    finally
                    {
                        if (working == true)
                        {
                            Dialog d = new Dialog(Game.this);
                            d.setTitle("Woo!");
                            TextView tv = new TextView(Game.this);
                            tv.setText("Woo");
                            d.setContentView(tv);
                            d.show();
                        }
                    }

【问题讨论】:

  • 如果有任何异常,你就吞下了。在你的游戏类中打印堆栈跟踪,如果有的话,看看它说了什么,无论如何都不是一个好习惯。 (在工作=假的那一行;)
  • 就是看看有没有插入就行了,我去试试printTrace看看返回什么。
  • @Jimmy printStackTrace() 返回注释。
  • 看看@laalto 的回答,他有鹰眼;)

标签: android sqlite insert


【解决方案1】:

在您的数据库创建 SQL 中,KEY_SCORE 与其类型之间缺少一个空格。最后的; 也放错了位置。改为:

db.execSQL("CREATE TABLE " + DATABASE_TABLE + " ( " + 
        KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
        KEY_SCORE + " INTEGER NOT NULL);");

修复后,卸载您的应用程序,以便重新创建数据库。你的onUpgrade()也有语法问题,所以只升级数据库版本不好。

记录异常以了解代码的问题也是一个好习惯。计算机在检测语法问题方面比人类好得多。

【讨论】:

  • 它仍然跳过 entry.createEntry(score);调试模式下的行。放入空间后是否需要对数据库做一些特殊的事情。我更改了版本号,但我不知道它是否真的会做任何事情。感谢您发现我的错字。
  • 您的 onUpgrade 也有类似的错误。只需卸载即可删除旧数据库。
  • 确实如此,我似乎对此不好。再次感谢
  • 我已经完全卸载了该应用程序并重新安装了它,但是它仍然跳过了 entry.create 行。我不明白为什么。
  • 在创建表 SQL 中还有一个语法问题。
猜你喜欢
  • 2018-01-26
  • 1970-01-01
  • 2020-06-17
  • 2010-12-23
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多