2011-04-21 43 views
0

我会感谢以下任何帮助: 已解决我是一个偶像! - 我有2个日志标签,一个在界面上,另一个在活动中。我在调试中监视接口标签,认为它包含活动标签。因此我只看到界面中的结果,而没有看到活动的结果。因此,我认为该活动不是“从界面获得回报” - 对不起。感谢那些试图帮助的人。 (dbHelper.getNumberOfRecords(); - 获取记录数 - 和 - dbHelper.findManyRecords(aNameDateRecord,“name”,“Sarah”); - 从数据库中获取一些记录)通过一个databaseHelper和另一个“接口”类从一个活动的sqlite数据库。搜索工作(我可以在调试“TAG”中看到结果) - 问题是结果应该被“返回”到调用活动中,但他们不是,任何有关为什么会发生这种情况的帮助将非常感谢。谢谢你,请参见下面的代码: “接口” 类的sqlite搜索没有返回光标到调用活动

部分...帮助类

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

}

终于activit y其中搜索被称为...

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 2011-04-21 20:54:44

+0

你是指游标对象为空还是空? – 2011-04-21 20:56:03

回答

0

它看起来像你关闭数据库后返回光标,也许这无效光标。

+0

我也这么认为,但例如getNumberOfRecords()getCount()结果被分配给一个整型变量。所以关闭数据库或光标不应该有影响。那么numberOfRecords变量应该返回到调用该方法的活动,但它不是 – idig 2011-04-22 07:35:42

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”对象来创建您的查询。

最后但并非最不重要的是,在你的“findManyRecords” - 方法中,你遍历整个游标,然后返回它。所以光标在返回的字段的末尾。不要这样做或使用“moveToFirst”方法。

+0

嗨问题是,例如,如果我从其活动的活动内部调用getNumberOfRecords(),并产生正确的计数,但只能在“接口“类这个结果不会返回到它被调用的活动(该方法有返回)。有任何想法吗?谢谢 – idig 2011-04-22 07:31:45

+0

是的,它被退回。但是你所返回的光标是它的提交结束,所以你不能再读它了。 – 2011-04-22 10:08:17