0

java を使用して mySQL データベースを作成しましたが、「getData()」メソッドにある「Cursor c」変数のインスタンスをクラスに 1 つだけ持たせることを試みています。これは、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
4

2 に答える 2

0

非静的クラス メソッドで静的フィールドにアクセスする方法の古典的な 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

ただし、マルチスレッド環境で実行されている多くのクラス インスタンス間でカーソル変数を共有する場合は、同期と初期化を慎重に検討する必要があります。スレッド間でカーソルを共有すると、エラーの診断が難しくなる可能性があります。

于 2013-07-27T08:34:36.827 に答える
0

非静的メソッドで静的フィールドにアクセスする方法を理解していただきありがとうございますが、それは私が探していたものではありませんでした。多分私は正しい質問をしなかった。とにかく、 getData() に引数 int の位置を取り、カーソルの現在の位置として使用し、 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
于 2013-07-28T14:02:49.503 に答える