2012-09-21 42 views
1

我是新来的Java,只是试图建立一个数据库。我设法创建了一个数据库,但是当我想要读取这些值时,它似乎会出错。cursor.moveToFirst似乎被跳过

这是我对我的设置活动代码(这要求对一个特定ID设定值,并在数据库中添加的话)

public class Settings extends Activity{ 

    Button Save; 
    static Switch SwitchCalculations; 
    public static String bool; 
    public static List<Integer> list_id = new ArrayList<Integer>(); 
    public static List<String> list_idname = new ArrayList<String>(); 
    public static List<String> list_kind = new ArrayList<String>(); 
    public static List<String> list_value = new ArrayList<String>(); 
    static Integer[] arr_id; 
    static String[] arr_idname; 
    static String[] arr_kind; 
    static String[] arr_value; 
    public static final String TAG = "Settings"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.settings); 

     Save = (Button) findViewById(R.id.btnSave); 
     SwitchCalculations = (Switch) findViewById(R.id.switchCalcOnOff); 

     readData(); 

     Save.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
         writeData(); 
         //Toast.makeText(this, "Data has been saved.", Toast.LENGTH_SHORT).show(); 
         readData(); 

        Save.setText("Opgeslagen"); 
      } 
     }); 
    } 
    public void writeData() { 
      int id = 1; 
      String idname = "switchCalcOnOff"; 
      String kind = "switch"; 
      boolean val = SwitchCalculations.isChecked(); 
      String value = new Boolean(val).toString(); 

      dbHelper_Settings dbh = new dbHelper_Settings(this); 
      SQLiteDatabase db = dbh.getWritableDatabase(); 
      ContentValues cv = new ContentValues(); 
      cv.put(dbh.C_ID, id); 
      cv.put(dbh.C_IDNAME, idname); 
      cv.put(dbh.C_KIND, kind); 
      cv.put(dbh.C_VALUE, value); 

      if (dbh.C_ID.isEmpty() == true) { 
       db.insert(dbh.TABLE, null, cv); 
       Log.d(TAG, "Insert: Data has been saved."); 
      } else if (dbh.C_ID.isEmpty() == false) { 
       db.update(dbh.TABLE, cv, "n_id='1'", null); 
       Log.d(TAG, "Update: Data has been saved."); 
      } else { 
       Log.d(TAG, "gefaald"); 
      } 
      db.close(); 
    } 
    public void readData() { 
     dbHelper_Settings dbh = new dbHelper_Settings(this); 
     SQLiteDatabase db = dbh.getWritableDatabase(); 
     List<String> list_value = new ArrayList<String>(); 
     String[] arr_value; 
     list_value.clear(); 

     Cursor cursor = db.rawQuery("SELECT " + dbh.C_VALUE + " FROM " + dbh.TABLE + ";", null); 

     if (cursor.moveToFirst()) { 
     do { 
      list_value.add(cursor.getString(0)); 
     } while (cursor.moveToNext()); 
     } 

     if (cursor != null && !cursor.isClosed()){ 

      cursor.close(); 
     } 
     db.close(); 
     arr_value = new String[list_value.size()]; 

     for (int i = 0; i < list_value.size(); i++){ 
      arr_value[i] = list_value.get(i); 
     } 
    } 
} 

然后,我有我的dbHelper活动见下文:

package com.amd.nutrixilium; 

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

public class dbHelper_Settings extends SQLiteOpenHelper{ 

    private static final String TAG="dbHelper_Settings"; 

    public static final String DB_NAME = "settings.db"; 
    public static final int DB_VERSION = 10; 
    public final String TABLE = "settings"; 
    public final String C_ID = "n_id"; // Special for id 
    public final String C_IDNAME = "n_idname"; 
    public final String C_KIND = "n_kind"; 
    public final String C_VALUE = "n_value"; 
    Context context; 

    public dbHelper_Settings(Context context) { 
     super(context, DB_NAME, null, DB_VERSION); 
     this.context = context; 
    } 

    // oncreate wordt maar 1malig uitgevoerd per user voor aanmaken van database 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String sql = String.format("create table %s (%s int primary key, %s TEXT, %s TEXT, %s TEXT)", TABLE, C_ID, C_IDNAME, C_KIND, C_VALUE); 

     Log.d(TAG, "onCreate sql: " + sql); 

     db.execSQL(sql); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("drop table if exists " + TABLE); // wist een oudere database versie 
     Log.d(TAG, "onUpgrate dropped table " + TABLE); 
     this.onCreate(db); 
    } 
} 

而奇怪的是我没有在这里得到任何错误消息。 但我用Log.d(TAG, text)来检查脚本被跳过的位置,并在cursor.moveToFirst()

那么谁能帮我解决这个问题?

回答

0

在这里,违背你似乎会发生什么,你居然检查一个文本常量不为空:

if (dbh.C_ID.isEmpty() == true) { 

它不是:它总是包含“N_ID”

我想你意图是找到具有该ID的记录,并根据结果插入或更新。

你应该这样做:尝试通过助手进行选择,然后插入或更新,如上面的代码。

编辑:

添加到您的帮助是这样的:

public boolean someRowsExist(SQLiteDatabase db) { 
    Cursor cursor = db.rawQuery("select EXISTS (select 1 from " + TABLE + ")", new String[] {}); 
    cursor.moveToFirst(); 
    boolean exists = (cursor.getInt(0) == 1); 
    cursor.close(); 
    return exists; 
} 

并用它来检查,如果你有在DB任何行:

if (dbh.someRowsExist(db)) { // instead of (dbh.C_ID.isEmpty() == true) { 
+0

我该如何解决这个问题?我如何检查db行是否存在?我可以使用像db.C_ID.contains(“1”)这样简单的东西吗? – Mart

+0

由于您是新手,因此开始正确的方式非常重要。这是通过确保你真正理解**代码的每行**。只是试图拼凑一些片段永远不会做魔术。当你知道的时候,你会得到问正确问题的力量。例如,搜索“android sqlite check if record exsists”会给你几个链接。但是当你明白发生了什么时,你只能问这些问题。请参阅我上面的编辑;希望能帮助到你。 –

+0

它几乎是你提供给我的完美代码。 在设置游标后的someRowsExists中,应该执行cursor.moveToFirst(); – Mart

0

看起来你”无法调试您的查询。 Android提供了一个方便的方法DatabaseUtils.dumpCursorToString(),它将整个游标格式化为一个字符串。然后,您可以将转储输出到LogCat并查看是否实际跳过了任何行。