1

以下にこのメソッドを示します。これは、sqlite データベースから、tblPitanja という名前の tbale (データベースには 3 つのテーブルが含まれています) からランダムな質問と、4 つの可能な回答を引き出します。ユーザーが質問に回答した後、同じ sqlite データベースから同じ ID を持つ質問と回答を別のテーブルから取得する必要があります。前の質問に関連する追加の質問をする必要があります。どうやってするか?私にとって今最も難しいのは、前の質問でどのIDが何であったかを知る方法です.

private void nextQuestion() {
        counter++;
        TestAdapter mDbHelper = new TestAdapter(this);
        mDbHelper.createDatabase();

        try{ 

            mDbHelper.open(); 

            Cursor c = mDbHelper.getTestData(generateWhereClause());

            mAnsweredQuestions.add(c.getLong(0));

            List<Answer> labels = new ArrayList<Answer>();

            labels.add(new Answer(c.getString(2), true));
            labels.add(new Answer(c.getString(3), false));
            labels.add(new Answer(c.getString(4), false));
            labels.add(new Answer(c.getString(5), false));

            tacanOdg = c.getString(2);


            Collections.shuffle(labels);

            byte[] image_bytes = c.getBlob(c.getColumnIndex("PITANJE"));
            ByteArrayInputStream inputStream = new ByteArrayInputStream(image_bytes); 
            Bitmap bp=BitmapFactory.decodeStream(inputStream);

            if(counter < 11){
            flag.setImageBitmap(bp);

            bOdgovor1.setText(labels.get(0).option);
            bOdgovor1.setTag(labels.get(0));
            bOdgovor1.setOnClickListener(clickListener);

            bOdgovor2.setText(labels.get(1).option);
            bOdgovor2.setTag(labels.get(1));
            bOdgovor2.setOnClickListener(clickListener);

            bOdgovor3.setText(labels.get(2).option);
            bOdgovor3.setTag(labels.get(2));
            bOdgovor3.setOnClickListener(clickListener);

            bOdgovor4.setText(labels.get(3).option);
            bOdgovor4.setTag(labels.get(3));
            bOdgovor4.setOnClickListener(clickListener);

            rezultat.setText(counter + "/10");
            score.setText("Score: " + brojacTacnihOdgovora);

            }else{
                brojacVremena.cancel();

            }
        }
        finally{ 
            mDbHelper.close();
        }

編集:

データベース ヘルパー:

public class DataBaseHelper extends SQLiteOpenHelper
{
private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window
//destination path (location) of our database on device
private static String DB_PATH = "/data/data/rs.androidaplikacije.flags/databases/";
private static String DB_NAME ="pitanja.sqlite";// Database name
private static SQLiteDatabase mDataBase; 
private final Context mContext;

public DataBaseHelper(Context mojContext) 
{
    super(mojContext, DB_NAME, null, 1);// 1? its Database Version
    DB_PATH = mojContext.getApplicationInfo().dataDir + "/databases/";
    this.mContext = mojContext;
}

public void createDataBase() throws IOException
{
    //If database not exists copy it from the assets


        this.getReadableDatabase();
        this.close();
        try 
        {
            //Copy the database from assests
            copyDataBase();
            Log.e(TAG, "createDatabase database created");
        } 
        catch (IOException mIOException) 
        {
            throw new Error("ErrorCopyingDataBase");
        }
    }
    /*Check that the database exists here: /data/data/your package/databases/Da Name
    private boolean checkDataBase()
    {
        File dbFile = new File(DB_PATH + DB_NAME);
        //Log.v("dbFile", dbFile + "   "+ dbFile.exists());
        return dbFile.exists();
    }
    */

    //Copy the database from assets
    private void copyDataBase() throws IOException
    {
        InputStream mInput = mContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream mOutput = new FileOutputStream(outFileName);
        byte[] mBuffer = new byte[1024];
        int mLength;
        while ((mLength = mInput.read(mBuffer))>0)
        {
            mOutput.write(mBuffer, 0, mLength);
        }
        mOutput.flush();
        mOutput.close();
        mInput.close();
    }

    //Open the database, so we can query it
    public boolean openDataBase() throws SQLException
    {
        String mPath = DB_PATH + DB_NAME;
        //Log.v("mPath", mPath);
        mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
        //mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        return mDataBase != null;
    }
    @Override
    public void close() 
    {
        if(mDataBase != null)
            mDataBase.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase arg0) {
        }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        Log.w("DataBaseHelper", "Upgrading database!!!!!");
          onCreate(arg0);

    }


}

アダプタ:

public class TestAdapter 
{
    protected static final String TAG = "DataAdapter";

    private final Context mContext;
    private SQLiteDatabase mDb;
    private DataBaseHelper mDbHelper;

    public TestAdapter(Context context) 
    {
        this.mContext = context;
        mDbHelper = new DataBaseHelper(mContext);
    }

    public TestAdapter createDatabase() throws SQLException 
    {
        try 
        {
            mDbHelper.createDataBase();
        } 
        catch (IOException mIOException) 
        {
            Log.e(TAG, mIOException.toString() + "  UnableToCreateDatabase");
            throw new Error("UnableToCreateDatabase");
        }
        return this;
    }

    public TestAdapter open() throws SQLException 
    {
        try 
        {
            mDbHelper.openDataBase();
            mDbHelper.close();
            mDb = mDbHelper.getReadableDatabase();
        } 
        catch (SQLException mSQLException) 
        {
            Log.e(TAG, "open >>"+ mSQLException.toString());
            throw mSQLException;
        }
        return this;
    }

    public void close() 
    {
        mDbHelper.close();
    }

     public Cursor getTestData(String whereClause)
     {;
         try
         {
             String sql ="SELECT * FROM tblPitanja WHERE 1 = 1 " + whereClause + " ORDER BY RANDOM() LIMIT 1";

             Cursor mCur = mDb.rawQuery(sql, null);
             if (mCur!=null)
             {
                mCur.moveToNext();
             }
             return mCur;
         }
         catch (SQLException mSQLException) 
         {
             Log.e(TAG, "getTestData >>"+ mSQLException.toString());
             throw mSQLException;
         }
     }
     public Cursor getTestDataGradovi()
     {;
         try
         {
             String sql ="SELECT * FROM tblGradovi LIMIT 1";

             Cursor mCur = mDb.rawQuery(sql, null);
             if (mCur!=null)
             {
                mCur.moveToNext();
             }
             return mCur;
         }
         catch (SQLException mSQLException) 
         {
             Log.e(TAG, "getTestData >>"+ mSQLException.toString());
             throw mSQLException;
         }
     }
     public Cursor getTestDataValute()
     {;
         try
         {
             String sql ="SELECT * FROM tblValute LIMIT 1";

             Cursor mCur = mDb.rawQuery(sql, null);
             if (mCur!=null)
             {
                mCur.moveToNext();
             }
             return mCur;
         }
         catch (SQLException mSQLException) 
         {
             Log.e(TAG, "getTestData >>"+ mSQLException.toString());
             throw mSQLException;
         }
     }
}

そして、追加の質問に対する私の新しいメソッド (まだ完成していません。db アダプター クラスから .getTestDataGradovi() を使用するようにいくつかの変更を加えて、最初のメソッドをコピーしただけです。

private void nextQuestionGrad() {
         flag.setVisibility(View.GONE);
         dodatnoPitanje.setVisibility(View.VISIBLE);

            TestAdapter mDbHelper = new TestAdapter(this);
            mDbHelper.createDatabase();

            try{ 

                mDbHelper.open(); 

                Cursor c = mDbHelper.getTestDataGradovi();

                mAnsweredQuestions.add(c.getLong(0));

                List<Answer> labels = new ArrayList<Answer>();

                labels.add(new Answer(c.getString(2), true));
                labels.add(new Answer(c.getString(3), false));
                labels.add(new Answer(c.getString(4), false));
                labels.add(new Answer(c.getString(5), false));

                tacanOdg = c.getString(2);

                Collections.shuffle(labels);


                dodatnoPitanje.setText(c.getString(1));

                bOdgovor1.setText(labels.get(0).option);
                bOdgovor1.setTag(labels.get(0));
                bOdgovor1.setOnClickListener(clickListenerGrad);

                bOdgovor2.setText(labels.get(1).option);
                bOdgovor2.setTag(labels.get(1));
                bOdgovor2.setOnClickListener(clickListenerGrad);

                bOdgovor3.setText(labels.get(2).option);
                bOdgovor3.setTag(labels.get(2));
                bOdgovor3.setOnClickListener(clickListenerGrad);

                bOdgovor4.setText(labels.get(3).option);
                bOdgovor4.setTag(labels.get(3));
                bOdgovor4.setOnClickListener(clickListenerGrad);

                score.setText("Score: " + brojacTacnihOdgovora);


                }
            }
            finally{
                mDbHelper.close();
            }
     }
4

1 に答える 1

0

getTestDataGradoviID で識別される 1 つの特定のレコードをロードするように変更する必要があります。

public Cursor getTestDataGradovi(long id) {
    String sql = "SELECT * FROM tblGradovi WHERE _ID = " + id;
    Cursor c = mDb.rawQuery(sql, null);
    c.moveToNext();
    return c;
}

nextQuestionで、現在の質問の ID をどこかに保存する必要があります。

mCurrentID = c.GetLong(0);

内部nextQuestionGradでは、保存された ID を使用して、対応する他の質問を取得できます。

Cursor c = mDbHelper.getTestDataGradovi(mCurrentID);
于 2013-04-01T08:43:52.650 に答える