2011-04-21 1 views
0

다음과 같은 도움을 주시면 감사하겠습니다 : SOLVED I AM AN IDIOT! - 나는 2 개의 로그 태그를 가지고 있는데 하나는 인터페이스에, 다른 하나는 활동에있다. 디버그에서 인터페이스 태그를 모니터링하면서 activity 태그가 포함되어 있다고 생각했습니다. 따라서 나는 인터페이스의 결과 만 보았고 그 결과는 보지 못했습니다. 따라서 나는 그 활동이 "인터페이스로부터의 복귀를 얻지 못했다"라고 생각했다 - 미안하다. 도움을 주려고하는 사람들 덕택입니다.sqlite가 커서를 호출 활동으로 되 돌리지 않았습니다.

레코드 수를 얻으려면 검색을 호출하십시오 (예 : dbHelper.getNumberOfRecords(); - dbHelper.findManyRecords (aNameDateRecord, "name", "Sarah")) - 데이터베이스에서 많은 레코드를 가져 오려면)를 databaseHelper 및 다른 "인터페이스"클래스를 통해 활동에서 sqlite 데이터베이스에 저장합니다. 검색 작동 (나는 디버그 "TAG"에서 결과를 볼 수 있습니다 .- 문제는 결과가 호출 작업에 "반환"해야하지만 그들은 are'nt합니다. 왜이 일이 일어나고 있는지에 대 한 어떤 도움을 많이 주시면 감사하겠습니다. . 아래에 감사 참조하십시오 코드 : "인터페이스"클래스의

부분 ... 헬퍼 클래스의

public class DatabaseInterface{ 

private static final String TAG = "HelloDatePicker"; 

private static final String TableName = "t_namesAndDates"; 
private static final String RowId = "_id"; 
private static final String Col_name = "name"; 
private static final String Col_date = "date"; 
private Context context; 
private DatabaseHelper dbHelper; 
private SQLiteDatabase database; 

public DatabaseInterface(Context context){ 
    this.context = context; 
} 
    //open the database 
public DatabaseInterface open(){ 
    dbHelper = new DatabaseHelper(context); 
    database = dbHelper.getWritableDatabase(); 
    return this; 
} 
    //close the database 
public DatabaseInterface close(){ 
    dbHelper.close(); 
    return this; 
} 

//get number of records in database 
public int getNumberOfRecords(){   
    open(); 
    String sql = "SELECT * FROM " + TableName;  
    Cursor cursor = database.rawQuery(sql, null); 
    int numberOfRecords = cursor.getCount(); 
    cursor.close(); 
    close(); 
    Log.i(TAG, "HelloDatePicker-getNumberOfRecords **** " + numberOfRecords); 
    return numberOfRecords; 
} 

//search for many records 
public Cursor findManyRecords(NameDateRecord aNameDateRecord, String columnName, String whereClause){ 
    open(); 

    Log.i(TAG, "HelloDatePicker-column aNameDateRecord = " + aNameDateRecord + " columnName = " + columnName + " whereClause = " + whereClause); 
    /* 
    String selection = columnName; 
    Log.i(TAG, "HelloDatePicker-column name = " + columnName + " whereClause = " + whereClause); 
    String[] selectionArgs = new String[] {"Sarah"};//searches on a name 
    String[] columns = new String[] {"_id","name","date"}; 
    for(int i=0;i<selectionArgs.length;i++) 
     Log.i(TAG, "HelloDatePicker-selectionArgs = " + selectionArgs[i]); 
    //Cursor cursor = database.query(TableName, columns, " name = ", selectionArgs, null, null, null); 
    */ 

    String sql = "SELECT * FROM " + TableName + " WHERE name = 'Sarah'"; 
    Cursor c = database.rawQuery(sql, null); 
    Log.i(TAG, "HelloDatePicker-getNumberOfRecords @@@@@@ " + c.getCount()); 

    c.moveToFirst(); 
    while (c.moveToNext()) { 
     // Your code 
     Log.i(TAG, "HelloDatePicker- id = " + c.getInt(c.getColumnIndex(RowId)) + " name " + c.getString(c.getColumnIndex(Col_name)) + " date = " + 
       c.getInt(c.getColumnIndex(Col_date))); 
    } 
    Log.i(TAG, "HelloDatePicker-findManyRecords"); 
    close(); 

    return c; 

} 

부분 ...

public class DatabaseHelper extends SQLiteOpenHelper{ 

private static final String TAG = "HelloDatePicker";  
private static final String DBname = "db_date"; 
private static final String TableName = "t_namesAndDates"; 
private static int versionNumber = 1; 

    //the constructor 
public DatabaseHelper(Context context) { 
    super(context, DBname, null, versionNumber); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void onCreate(SQLiteDatabase database) { 
    //create table once on installation of app 
    String columns = "(_id integer primary key autoincrement,name text not null,date integer)";  
    String sql = "CREATE TABLE " + TableName + columns; 
    Log.i(TAG, "HelloDatePicker-create database-sql = " + sql); 
    database.execSQL(sql);  
} 

@Override 
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { 
    // TODO Auto-generated method stub 
    // Logs that the database is being upgraded 
    Log.i(TAG, "Upgrading database from version " + oldVersion + " to " 
      + newVersion + ", which will destroy all old data"); 

    // Kills the table and existing data 
    database.execSQL("DROP TABLE IF EXISTS notes"); 

    // Recreates the database with a new version 
    onCreate(database);  
} 

}

마지막으로 활동하다 검색 결과가 어디에서 왔는지 ...

public class HelloDatePicker extends Activity { 

private static final String TAG = "datepicker"; 

private static final String RowId = "_id"; 
private static final String Col_name = "name"; 
private static final String Col_date = "date"; 

private TextView mDateDisplay; 
private Button mPickDate; 
private int mYear; 
private int mMonth; 
private int mDay; 

private DatabaseInterface dbHelper; 

NameDateRecord aNameDateRecord; 



static final int DATE_DIALOG_ID = 0; 
/** Called when the activity is first created. */ 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Log.i(TAG, "in onCreate HelloDatePicker"); 

    dbHelper = new DatabaseInterface(this); 
     //to get number of records in database 
    int numberRecords = dbHelper.getNumberOfRecords(); 
    Log.i(TAG, "number of records in database &&&&&& " + numberRecords); 
     //to search for records 
    dbHelper = new DatabaseInterface(this); 
    Cursor c = dbHelper.findManyRecords(aNameDateRecord, "name", "Sarah"); 
    Log.i(TAG, "HelloDatePicker-getNumberOfRecords +++++ " + c.getCount()); 
    c.moveToFirst(); 
    while (c.moveToNext()) { 
     // Your code 
     Log.i(TAG,"HelloDatePicker- id = " + c.getInt(c.getColumnIndex(RowId)) + " name " 
         + c.getString(c.getColumnIndex(Col_name)) 
         + " date = " + c.getInt(c.getColumnIndex(Col_date))); 

감사합니다.

관련

데이터베이스를 닫은 후 커서를 반환하는 것 같습니다
+0

오류를 더 분명하게 보이게하십시오. 전체 소스를 살펴 보지 마십시오. – JoxTraex

+0

커서 객체가 null이거나 비어 있음을 의미합니까? –

답변

0

은, 어쩌면이 커서를 무효화합니다.

+0

나는 너무 생각하지만 예를 들어 getNumberOfRecords() getCount() 결과는 정수 변수에 할당됩니다. 그래서 데이터베이스 나 커서를 닫아도 영향을 미치지 않아야합니다. numberOfRecords 변수는 메소드가 호출 된 액티비티로 리턴되어야하지만, – idig

0

이 나쁜 SQL-스타일 : 대신에

String sql = "SELECT * FROM " + TableName;  
Cursor cursor = database.rawQuery(sql, null); 
int numberOfRecords = cursor.getCount(); 

사용 "count"-function! 또한 "dbHelper"를 두 번 제작하는 이유는 무엇입니까? 그리고 :

String sql = "CREATE TABLE " + TableName + columns; 
database.execSQL(sql); 

은 쓰레기입니다. "rawQuery()", "query()"또는 "PreparedStatement"-Object를 사용하여 쿼리를 만듭니다.

마지막으로 "findManyRecords"메소드에서 전체 커서를 통과 한 다음 반환합니다. 따라서 Cursor는 반환 된 필드의 끝에 있습니다. 이것을하지 않거나 "moveToFirst"- 방법을 사용하지 마십시오.

+0

이 아닙니다. 문제는 예를 들어 호출하면 : getNumberOfRecords()가 액티비티 내에서 작동하고 정확한 카운트를 생성하지만 " 인터페이스 "클래스에서이 결과는 호출 된 액티비티로 다시 리턴되지 않습니다 (메소드에 리턴이 있음). 어떤 아이디어? 감사합니다 – idig

+0

예, 반환됩니다. 그러나 당신이 돌아 오는 커서는 끝났고 그 끝은 사라졌습니다. 그래서 더 이상 읽을 수는 없습니다. –

관련 문제