【问题标题】:Insert returns -1 with SQLite使用 SQLite 插入返回 -1
【发布时间】:2011-05-05 04:22:13
【问题描述】:

我已经为此苦苦挣扎了好几个小时。我的 SQLite 插入总是返回 -1 ...

这是我在一个文件中的主要活动的代码,它在另一个文件中调用我的数据库代码:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

    jobsdb = new NotifyJobsDBAdapter(this);
    jobsdb.open();

    currentjobid = 1;
    currentjob = new Job(currentjobid, "Starting Tele Num", "Starting Text Msg");
    currentjobid = jobsdb.insertJob(currentjob);
   // this last statement returns -1
}

这是我在另一个文件中的数据库适配器代码:

公共类 NotifyJobsDBAdapter {

private static final String DB_NAME = "notifyjobsdb";
private static final String DB_TABLE = "notifyjobs";
private static final int DB_VERSION = 1;
private final Context ctx;

// Database column names
private static final String JOB_ID = "jobid";
private static final String JOB_TELE = "contactnumber";
private static final String JOB_TEXT = "textmessage";

private SQLiteDatabase notifyjobsdb;
private NotifyJobsDatabaseHelper dbHelper;
private boolean openness;
private boolean err;
private boolean err0;
private int cnt;
private int i1;
private String s1;
private String s2;
private static String s3;
private int res;
private SQLiteException ex0;
private SQLiteException ex1;

private static class NotifyJobsDatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_CREATE = 
        "CREATE TABLE IF NOT EXISTS " + DB_TABLE +
        " (+ " + JOB_ID + "INTEGER PRIMARY KEY, " +
        JOB_TELE + "TEXT NOT NULL, " +
        JOB_TEXT + "TEXT NOT NULL);";

    private static final String DATABASE_UPGRADE = 
        "DROP TABLE IF EXISTS notifyjobs ";

    public NotifyJobsDatabaseHelper(Context _context) {
        super(_context, DB_NAME, null, DB_VERSION);
    }

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

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(DATABASE_UPGRADE);
                }

}

public NotifyJobsDBAdapter(Context _context) {
    this.ctx = _context;
}

public void open() { 
    dbHelper = new NotifyJobsDatabaseHelper(ctx);
    try { notifyjobsdb = dbHelper.getWritableDatabase();
    } catch(SQLiteException ex) {
        ex0 = ex;
    }

}  

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

//这是我的问题方法

public int insertJob(Job _job) {
    ContentValues newJobValues = new ContentValues();
    newJobValues.put(JOB_ID, _job.getjobid());
    newJobValues.put(JOB_TELE, _job.gettelenum());
    newJobValues.put(JOB_TEXT, _job.gettextmsg());
    notifyjobsdb.beginTransaction();
    // res is always returned a -1
    try {
    res = (int) notifyjobsdb.insertOrThrow(DB_TABLE, null, newJobValues);
    } catch (SQLiteException ex) {
        ex1 = ex;
    }

    notifyjobsdb.setTransactionSuccessful(); 
    close();
    return res;

这里,res 始终为 -1,调试器将 ex1 的详细信息显示为

"没有这样的表:notifyjobs:,编译时:INSERT INTO notifyjobs(contactnumber, textmessage, jobid) VALUES(?, ?, ?);

我将不胜感激!

【问题讨论】:

    标签: android


    【解决方案1】:

    必须将表的主要 id 字段命名为“_id”,以便 Android 知道在哪里绑定表的 id 字段。所以我建议你尝试将你的 ID 列命名为“_id”而不是“jobid”。

    另外,我建议不要使用只执行一项操作的事务(您可以稍后决定将多个插入包装到一个事务中)。

    【讨论】:

    • 您为什么决定必须将主 id 字段命名为“_id”?有参考吗?
    • private static final String DATABASE_CREATE = "CREATE TABLE IF NOT EXISTS" + DB_TABLE + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + JOB_TELE + "TEXT NOT NULL, " + JOB_TEXT + "TEXT NOT NULL) ;";
    • 现在我没有得到-1,但我每次都得到相同的异常?
    • @Konstantin:根据我对 SDK 和各种示例的理解,这是一个约定。请参阅 developer.android.com/reference/android/provider/…markmail.org/message/7dslzyn7elk73wkt:“_id 以在 Android SDK 内的许多地方使用的下划线约定命名,有助于跟踪状态。”
    • @MLW:你能给出异常消息吗?
    【解决方案2】:
    1. 您的创建语句是错误的。这是正确的:

      private static final String DATABASE_CREATE = 
      "CREATE TABLE IF NOT EXISTS " + DB_TABLE +
      " (" + JOB_ID + " INTEGER PRIMARY KEY, " +
      JOB_TELE + " TEXT NOT NULL, " +
      JOB_TEXT + " TEXT NOT NULL);";
      
    2. 如果您尝试插入与约束不匹配的行(例如,JOB_TELE/JOB_TEXT 列的主键或空值已存在),则会出现异常。

    【讨论】:

      【解决方案3】:

      您的 DATABASE_CREATE 语句中有错误,因此您的表没有创建。这就是您收到错误消息的原因。尝试修复您的创建语句(打开括号后删除加号):

      private static final String DATABASE_CREATE = 
          "CREATE TABLE IF NOT EXISTS " + DB_TABLE +
          " (" + JOB_ID + " INTEGER PRIMARY KEY, " +
          JOB_TELE + " TEXT NOT NULL, " +
          JOB_TEXT + " TEXT NOT NULL);";
      

      【讨论】:

      • 你说得对,这很奇怪,我想知道这是否是我的剪切和粘贴。以上不会编译吗?总之,不错的看点。我现在仍然收到 ex1 异常,但没有返回 -1。
      • 该死,你是对的。在 TEXT 之前也是如此。修复了 sn-p。
      猜你喜欢
      • 2013-02-07
      • 2011-04-01
      • 2022-09-23
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 2014-10-22
      • 2019-07-17
      • 1970-01-01
      相关资源
      最近更新 更多