[英]Java- Make Cursor variable static in a method
我已經用Java創建了一個mySQL數據庫,而我想做的就是讓該類在'getData()'方法中只有'Cursor c'變量的一個實例。 這樣一來,只要調用getData()
方法,游標就可以從中斷處繼續讀取數據庫,而不是從頭開始。
我嘗試將“ Cursor c”從方法中刪除,使其固定為靜態,但隨后導致其他問題。
你能告訴我如何正確地做嗎?
public class SQLClass {
public static final String KEY_ROWID = "_id";
public static final String KEY_NAME = "IncomeName";
public static final String KEY_AMOUNT = "IncomeAmount";
private static String DATABASE_NAME = "MoneyTracker";
private static String DATABASE_TABLE = "IncomeTable";
private static int DATABASE_VERSION = 1;
private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;
private static class DbHelper extends SQLiteOpenHelper{
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}//end DbHelper constructor
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + DATABASE_TABLE + "(" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ KEY_NAME + " TEXT NOT NULL, " + KEY_AMOUNT + " TEXT NOT NULL);");
}//end onCreate method
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
// TODO Auto-generated method stub
db.execSQL("DROP IF EXISTS " + DATABASE_NAME);
onCreate(db);
}//end onUpgrade method
}//end class DbHelper
public SQLClass (Context c){
ourContext = c;
}//end constructor SQLClass
public SQLClass open()throws SQLException{
ourHelper = new DbHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;
}//end method open
public void close(){
ourHelper.close();
}//end method close
public long createEntry(String name, String amount) {
// TODO Auto-generated method stub
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, name);
cv.put(KEY_AMOUNT, amount);
return ourDatabase.insert(DATABASE_TABLE, null, cv);
}
public String[] getData() {
// TODO Auto-generated method stub
String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_AMOUNT};
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String[] result = new String[]{"","",""};
int iRow = c.getColumnIndex(KEY_ROWID);
int iName = c.getColumnIndex(KEY_NAME);
int iAmount = c.getColumnIndex(KEY_AMOUNT);
c.moveToNext();
result[0] = c.getString(iRow);
result[1] = c.getString(iName);
result[2] = c.getString(iAmount);
return result;
}//end method getData
}//end class SQLClass
這是一個經典的Java示例,如何在非靜態類方法中訪問靜態字段:
public class MyClass {
private static int staticCursor;
{ // Initialize
staticCursor = 1;
}
public int getData(){
int retval;
retval = MyClass.staticCursor;
MyClass.staticCursor++;
return retval;
}
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
MyClass myClass3 = new MyClass();
System.out.println( myClass1.getData() );
System.out.println( myClass2.getData() );
System.out.println( myClass3.getData() );
System.out.println( myClass1.getData() );
}
}
run results:
====================
1
2
3
4
但是,如果計划在多線程環境中運行的許多類實例之間共享游標變量,則需要仔細考慮的同步和初始化工作,線程之間共享游標會導致難以診斷的錯誤。
謝謝您幫助我了解了如何以非靜態方法訪問靜態字段,但這不是我想要的。 也許我沒有問正確的問題。 無論如何,我設法通過使getData()接受參數int position作為游標的當前位置並將c.moveToNext()更改為c.moveToPosition(position)來解決問題。
public String[] getData(int position) {
// TODO Auto-generated method stub
String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_AMOUNT};
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String[] result = new String[]{"","",""};
int iRow = c.getColumnIndex(KEY_ROWID);
int iName = c.getColumnIndex(KEY_NAME);
int iAmount = c.getColumnIndex(KEY_AMOUNT);
c.moveToPosition(position);
if (!c.isAfterLast()){
result[0] = c.getString(iRow);
result[1] = c.getString(iName);
result[2] = c.getString(iAmount);
}else if(c.isAfterLast()){
result[0] = "false";
}
return result;
}//end method getData
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.