sqlite search не возвращает курсор к вызывающей активности - PullRequest
0 голосов
/ 22 апреля 2011

Буду признателен за любую помощь в следующем: решено Я ИДИОТ!- У меня было 2 тега журнала, один в интерфейсе и другой в деятельности.я отследил тег интерфейса в отладке, думая, что он включает тег активности.следовательно, я видел только результат в интерфейсе, а не результаты для деятельности.поэтому я предположил, что активность не была "получение возврата от интерфейса" - извините.спасибо тем, кто пытался помочь.

я вызываю поиск (dbHelper.getNumberOfRecords (); - чтобы получить количество записей - и - dbHelper.findManyRecords (aNameDateRecord, "name", "Sarah");- получить ряд записей из базы данных) в базе данных sqlite из действия через databaseHelper и другой класс «interface».поиск работает (я могу видеть результаты в отладке «TAG». - Проблема в том, что результаты должны быть «возвращены» вызывающей деятельности, но это не так. Любая помощь по поводу того, почему это происходит, будет высоко оценена.спасибо. смотрите код ниже:

часть класса "interface" ...

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)));

заранее спасибо.

regards

Ответы [ 2 ]

0 голосов
/ 22 апреля 2011

Это плохой стиль SQL:

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

Используйте вместо функции count "!Кроме того, почему вы создаете "dbHelper" дважды?А это:

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

это фигня.Используйте «rawQuery ()», «query ()» или «PreparedStatement» -Object для создания объекта вашего запроса.

И последнее, но не менее важное: в вашем методе «findManyRecords» вы просматриваете весь курсор, а затемверни это.Таким образом, курсор находится в конце возвращенного поля.Не делайте этого и не используйте метод "moveToFirst".

0 голосов
/ 22 апреля 2011

Похоже, вы возвращаете курсор после закрытия базы данных, возможно, это делает курсор недействительным.

...