0

よし…もう十分だ。

私は完全にイライラしています。

そのため、新しいモニターではなく、助けを求めたいと思います。

...そして、それらはここでは非常に高価です。

簡単に言えば...私はデータベースを持っています。そしてテーブル。

private String DEFINE_PROP_TYPES = "CREATE TABLE " + TABLE_PROP_TYPES + "("
        + TABLE_ID + " INTEGER PRIMARY KEY, "
        + TABLE_PROP_TYPE_NAME + " TEXT NOT NULL"
        + ")";

それを管理するための適切な手段として、「Adapter」クラスがスローされます。

public abstract class DBAdapter 
{
    static public final String C_COLUMN_ID = "_id";

    protected Context context;
    protected DBHelper dbHelper;
    protected SQLiteDatabase db;
    protected String managedTable;
    protected String[] columns;

    public String getTableManaged() 
    {
        return managedTable;
    }

    public void setTableManaged(String managedTable) 
    {
        this.managedTable = managedTable;
    }

    public void setColumns(String[] columns)
    {
        this.columns = columns;
    }

    public DBAdapter(Context context)
    {
        this.context = context;
    }

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

    public DBAdapter open() throws SQLException
    {
        dbHelper = new DBHelper(context);
        db = dbHelper.getWritableDatabase();
        return this;
    }

    public Cursor getList()
    {
        Cursor c = db.query(true, managedTable, columns, null, null, null, null, null, null);

        return c;       
    }

    public long insert(ContentValues reg)
    {
        return 0;
    }
}
public class PropTypesDBAdapter extends DBAdapter
{
    static public final String C_TABLE_PROP_TYPES = "PROP_TYPES";

    static public final String C_COLUMN_ID = "_id",
        C_COLUMN_PROP_TYPES_NAME = "re_prop_type";

    public PropTypesDBAdapter(Context context)
    {
        super(context);
        this.setTableManaged(C_TABLE_PROP_TYPES);
        this.setColumns(new String[] { C_COLUMN_ID,
            C_COLUMN_PROP_TYPES_NAME });
    }

    public long insert(ContentValues reg)
    {
        if (db == null)
        {
            open();
        }

        return db.insert(C_TABLE_PROP_TYPES, null, reg);
    }
}

そして、このかわいいものの山に加えて、私は活動クラスを持っています.

スピナー付き。

public class PropDetailActivity extends Activity implements LocationListener
{
    // insert here some blah-blah constants not needed by spinners

    private PropDBAdapter mHouses;
    private RatingsDBAdapter mRatings;
    private PropTypesDBAdapter mPropTypes;
    private Cursor mCursorHouses, 
        mCursorRatings,
        mCursorPropTypes;

    long mPropType;

    private long mPropId;

    private Spinner spinnerRating, spinnerType;
    AdapterView.OnItemSelectedListener spnLstPropType, spnLstRating;

    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_house_detail);

        Intent intent = getIntent();
        Bundle extra = intent.getExtras();

        if (extra == null)
        {
            return;
        }

        // Figure all view widgets being retrieved here, including...

        spinnerRating = (Spinner) findViewById(R.id.spinnerRating);
        spinnerType = (Spinner) findViewById(R.id.spinnerType);

        // Create adapter and cursor-y things here

        mHouses = new PropDBAdapter(this);
        mHouses.open();

        // And now, for the juicy, deliciously irritating stuff:

        String[] from = new String[] { PropTypesDBAdapter.C_COLUMN_PROP_TYPES_NAME };

        int[] to = new int[] { android.R.id.text1 };

        mPropTypes = new PropTypesDBAdapter(this);
        mPropTypes.open();

        mCursorPropTypes = mPropTypes.getList();

        @SuppressWarnings("deprecation")
        SimpleCursorAdapter adapterPropTypes = new SimpleCursorAdapter(this, 
                android.R.layout.simple_spinner_item, 
                mCursorPropTypes, 
                from,       /*new String[] { RatingsDBAdapter.C_COLUMN_RATING_NAME }, */
                to);        /*new int[] { android.R.id.text1 } */

        adapterPropTypes.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spinnerType.setAdapter(adapterPropTypes);

        spinnerRating.setSelection(pos);

        spnLstPropType = new AdapterView.OnItemSelectedListener()
        {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int pos, long id) 
            {
                mPropType = id;
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) { }
        };
        spinnerType.setOnItemSelectedListener(spnLstPropType);

    private int getItemPositionById(Cursor c, long id, DBAdapter adapter)
    {
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
        {
            if (c.getLong(c.getColumnIndex(DBAdapter.C_COLUMN_ID)) == id)
            {
                return c.getPosition();
            }
        }

        return 0;
    } 

    private void query(long id) 
    {
        mCursorHouses = mHouses.getRecord(id);

        // Figure values being retrieved and set on their widgets instead of this comment... and now...

        mPropType = mCursorHouses.getInt(mCursorHouses.getColumnIndex(PropDBAdapter.C_PROP_TYPE_ID));

        spinnerType.setSelection(
            getItemPositionById(
                    mCursorRatings, 
                    mCursorHouses.getColumnIndex(PropDBAdapter.C_PROP_TYPE_ID),
                    mPropTypes
                )
            );

    private void save() 
    {
        ContentValues reg = new ContentValues();

        // Read: values being put into 'reg'... eventually it should reach this:

        reg.put(PropDBAdapter.C_PROP_TYPE_ID, mPropType);

        try
        {
            if (mFormMode == PropListActivity.C_CREATE)
            {
                mHouses.insert(reg);
                Toast.makeText(PropDetailActivity.this, R.string.house_create_notice, Toast.LENGTH_LONG).show();
            }
            else if (mFormMode == PropListActivity.C_EDIT)
            {
                Toast.makeText(PropDetailActivity.this, R.string.house_edit_notice, Toast.LENGTH_LONG).show();

                reg.put(PropDBAdapter.C_COLUMN_ID, mPropId);

                long resultCode = mHouses.update(reg);
                Log.i(this.getClass().toString(), "Database operation result code: " + resultCode);         
            }
        }
        catch(SQLException e)
        {
            Log.i(this.getClass().toString(), e.getMessage());
        }

        setResult(RESULT_OK);
        finish();
    }
}   

スピナーは悪い子です。その上怠惰な不良少年。

それらは、表示するためのデータ (不動産タイプのリスト) をロードします。

いくつかのスパンキングの後、それはです。

しかし、選択した値を SQLiteに保存することを望んでいますか? そして、データベースからデータを取得するときにその正確な値を表示するには?

ああ、いや、まさか。

彼らは頑固に、アクティビティの開始時に常に同じ値を表示することに固執します。

だから...お願い...私はプロジェクトの私の申し訳ない言い訳を保存するためにあなたの集合的な知恵を利用しなければなりません...

お願いしますお願いします? :)

(カットされていないコード全体に飛び込みたい場合は、ここにGITリポジトリがあります: https://github.com/CruxMDQ/Quoterv3 )

4

2 に答える 2

2

コードを確認したところ、問題が見つかったと思います。 のqueryメソッドの次の行を変更してくださいPopDetailActivity.java
するためspinnerRatingに:

spinnerRating.setSelection(
    getItemPositionById(
        mCursorRatings, 
        mCursorHouses.getInt(mCursorHouses.getColumnIndex(PropDBAdapter.C_PROP_RATING_ID)),
        mRatings
    )
);

とのためspinnerTypeに:

spinnerType.setSelection(
    getItemPositionById(
        mCursorPropTypes, 
        mCursorHouses.getInt(mCursorHouses.getColumnIndex(PropDBAdapter.C_PROP_TYPE_ID)),
        mPropTypes
    )
);

編集:

クエリメソッドではmPropTypeId、を呼び出して初期化しますgetItemPositionById()が、その呼び出しでは、最初のパラメーターはmCursorPropTypesの代わりにする必要がありますmCursorHouses

于 2013-08-27T21:33:17.157 に答える
0

いくつかのこと:

SQLite(1)実際にデータベースを作成したり、SQLiteOpenHelperクラスを使用してそのデータにアクセスしたりする場所はどこにもありません。このチュートリアルを見てください。データを格納するために設定された単純な単一のテーブルを使用します。データベースを作成すると、読み書きが簡単になります。データベースが実際に作成されていることを確認します。

(2)SQL探しているデータを返すためのクエリはどこにありますか? データが追加されている場合でも、完了時に正しいデータを取得していることを確認する必要がありますCursor。毎回同じ値を取得している場合、毎回新しいデータを追加し、カーソルで同じ値を取得している可能性があります。つまり、新しく追加されたデータを取得するようにカーソルに指示していません。同じインデックス?

そこにあるデータを置き換える必要がある場合は、挿入ではなく更新クエリを使用する必要があります。

于 2013-08-27T17:33:18.167 に答える