2012-09-21 6 views
1

저는 Java를 처음 사용하고 데이터베이스를 만들려고했습니다. DB를 만들었지 만 모두 값을 읽고 싶을 때 오류가있는 것 같습니다. cursor.moveToFirst가 생략 된 것 같습니다.

그런 다음 (특정 ID에 값을 설정하고 DB에 추가 요청) 내 설정 활동에 대한 내 코드

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

처음 접하는 분이라면 올바른 방법을 시작하는 것이 중요합니다. 그리고 코드의 각 ** 라인을 실제로 이해하는 것입니다. 단편들을 모으려고 시도하는 것은 결코 마술을하지 않습니다. 당신이 알 때, 당신은 올바른 질문을 할 수있는 힘을 얻습니다. 예를 들어, "레코드 exsists 경우 안드로이드 sqlite 확인"에 대한 인터넷 검색은 당신에게 몇 가지 링크를 제공 할 것입니다. 그러나 당신은 그 일들을 이해할 때만 질문 할 수 있습니다. 위의 편집을 참조하십시오. 도움이되기를 바랍니다. –

+0

당신이 제공 한 거의 완벽한 코드입니다. 커서가 설정된 후 someRowsExists에서 cursor.moveToFirst()를 수행해야합니다. – Mart

0

당신처럼 보이는 '을 쿼리를 디버깅하는 데 문제가 있습니다. Android는 전체 커서를 String으로 형식화하는 편리한 메소드 DatabaseUtils.dumpCursorToString()을 제공합니다. LogCat에 덤프를 출력하여 실제로 건너 뛴 행이 있는지 확인할 수 있습니다.

관련 문제