首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android SQLite -第一次插入的值总是丢失

Android SQLite -第一次插入的值总是丢失
EN

Stack Overflow用户
提问于 2014-06-01 11:13:19
回答 1查看 1.3K关注 0票数 0

这有点吓人--首先插入的数据总是会丢失。

无论我做什么-我总是丢失我的第一个交易细节。类似地,如下所示,我添加了两次事务-但是当我获得事务表的返回结果的大小时,它总是1-而不是2。

如果我做错了什么,让我知道?

提前感谢

我将按如下方式添加事务:

代码语言:javascript
复制
transactionHelper th = new transactionHelper(this.activity.getApplicationContext());
values.clear();
values = new ContentValues();

values.put("accountid", accountID );
values.put("amount", totalBalance);
values.put("transactiontype", 1);
values.put("checknumber", "");
values.put("checkdate", transactionDate);
values.put("cleared", 1);
values.put("notes", "Starting Balance");
values.put("categoryid", startCat);

boolean added = th.addTransaction(values);
Log.v("jv", "Is this added or not: " + added);

th.addTransaction(values);
Log.v("jv", "nothing added: " + th.getAll().size());

我的类看起来像这样:

代码语言:javascript
复制
public transactionHelper(Context context) { super(context, DATABASE_NAME , null, 1); }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(
                "CREATE TABLE IF NOT EXISTS transactions ( " +
                "transactionid INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "accountid INTEGER, "+
                "amount REAL, " +
                "transactiontype INTEGER, " +
                "checknumber TEXT, " +
                "checkdate TEXT, " +
                "cleared INTEGER," +
                "notes TEXT," +
                "categoryid INTEGER)"
        );
    }

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

    public boolean addTransaction(ContentValues values) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.insert("transactions", null, values);
        return true;
    }

    public boolean updateTransaction(Integer id, ContentValues values) {
        try {
            SQLiteDatabase db = this.getWritableDatabase();
            db.update("transactions", values, "transactionid = ? ", new String[] { Integer.toString(id) } );
        } catch(Exception e) { Log.v("jv", "Exception in Update Contact: " + e.toString()); return false;}
        return true;
    }

    public int deleteTransaction(Integer id) {
        int numDeleted = 0;

        try {
            SQLiteDatabase db = this.getWritableDatabase();
            numDeleted = db.delete("transactions","transactionid = ? ", new String[] { Integer.toString(id) });
        } catch(Exception e) { Log.v("jv", "Exception in deleteTransaction: " + e.toString()); }


        return numDeleted;
    }

    public cTransactions getTransaction(int id){
         cTransactions  ct = new cTransactions();

         try {
             SQLiteDatabase db = this.getReadableDatabase();
             Cursor cur =  db.rawQuery( "select * from transactions where transactionid="+id+"", null );

             if( cur.moveToFirst() ) {
                ct.setTransactionID(cur.getInt(0));
                ct.setAccountID(cur.getInt(1));
                ct.setAmount(cur.getDouble(2));
                ct.setTransactionType(cur.getInt(3));
                ct.setCheckNumber(cur.getString(4));
                ct.setCheckDate(cur.getString(5));
                ct.setCleared( cur.getInt(6));
                ct.setNotes(cur.getString(7));
                ct.setCategory(cur.getInt(8));
             }
         } catch (Exception e) { Log.v("jv", "Exception in GetTransaction: " + e.toString() ); }
         return ct;
     }

    public ArrayList<Object> getAll() {
        ArrayList<Object> ret = new ArrayList<Object>();

        try {
            String query = "SELECT * FROM transactions";
            SQLiteDatabase db = this.getWritableDatabase();
            Cursor cur = db.rawQuery(query, null);

            if( cur != null )
                cur.moveToFirst();

            while( cur.moveToNext()) {
                cTransactions ct = new cTransactions();
                ct.setTransactionID(cur.getInt(0));
                ct.setAccountID(cur.getInt(1));
                ct.setAmount(cur.getDouble(2));
                ct.setTransactionType(cur.getInt(3));
                ct.setCheckNumber(cur.getString(4));
                ct.setCheckDate(cur.getString(5));
                ct.setCleared( cur.getInt(6));
                ct.setNotes(cur.getString(7));
                ct.setCategory(cur.getInt(8));
                ret.add(ct);
            }
        } catch(Exception e) { Log.v("jv", e.toString()); }
        return ret;
    }
EN

回答 1

Stack Overflow用户

发布于 2014-06-01 11:36:02

cursor.moveToFirst()将游标设置到第一个结果行。然后立即调用cursor.moveToNext(),它前进到第二个结果行。因此,您总是跳过getAll()中的第一行。

您可以将您的循环更改为do-while来修复它:

代码语言:javascript
复制
cursor.moveToFirst();
do{
  // get the values
} while (cursor.moveToNext());
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23976437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档