【问题标题】:Android spinner loads contents based on multiple table data column comparisonAndroid spinner 基于多表数据列比较加载内容
【发布时间】:2019-11-05 19:35:46
【问题描述】:

我有一个由三个微调器和一个表格组成的 UI。 (Spinner1, Spinner2, Spinner3) 分别。 Spinner2,Spinner3 根据 Spinner1 的选择交换值。根据我的要求将内容插入表格(LABELS2)

Spinner1,Spinner2,Spinner3 的值是从一个表"LABELS"中检索出来的。

点击保存按钮时,所有三个微调器值都被插入到另一个表 "LABELS2"。

要求:Spinner2 应根据表“Labels”和“Labels2”之间的比较加载内容。

背后的想法是避免数据插入中的重复,并知道保存数据后还剩下多少条记录。

示例:表“标签”有 3 条记录

1.("A1”,”EXTRA1”,”MORE1");
2,("A1”,”EXTRA2”,”MORE2");
3,("A1”,”EXTRA2”,”MORE2");

MainActivity

public class MainActivity extends AppCompatActivity {

    DatabaseHandler mDH;
    Spinner mSpinner1,mSpinner2,mSpinner3;
    Cursor mSpinner1Csr,mSpinner2Csr,mSpinner3Csr;
    SimpleCursorAdapter mSpinner1Adapter,mSpinner2Adapter,mSpinner3Adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSpinner1 = this.findViewById(R.id.spinner1);
        mSpinner2 = this.findViewById(R.id.spinner2);
        mSpinner3 = this.findViewById(R.id.spinner3);
        mDH = new DatabaseHandler(this);
        addSomeTestingData(); // ADD testing data if none
        manageSpinner1(); // Manages spinner1 not that spinner 1 invokes manage spinner2 and spinnr manages spinner3

    }

    private void addSomeTestingData() {
        if(DatabaseUtils.queryNumEntries(mDH.getWritableDatabase(),DatabaseHandler.TABLE_LABELS) > 0) return;

        // Data for LABELS2 table (spinner 1 (note 1st column listed in spinner))
        mDH.insertLabel("A1”,”EXTRA1”,”MORE1");
        mDH.insertLabel("A1”,”EXTRA2”,”MORE2");
        mDH.insertLabel("A1”,”EXTRA3”,”MORE5");

        mDH.insertLabel1("A1EXTRA1");
        mDH.insertLabel1("A1EXTRA2");
        mDH.insertLabel1("B1EXTRA1");
        mDH.insertLabel1("B1EXTRA2");
        mDH.insertLabel1("L1EXTRA1");
        mDH.insertLabel1("L1EXTRA2");

        // Data for LABELS table (spinner 1,2,3)
        mDH.insertlabel("A1”,”EXTRA1”,”MORE1");
        mDH.insertlabel("A1”,”EXTRA2”,”MORE2");
        mDH.insertlabel("A1”,”EXTRA3”,”MORE5");

    }

    private void manageSpinner1() {
        mSpinner1Csr = mDH.getAllLabelsForSpinner1AsCursor();
        if (mSpinner1Adapter == null) {
            mSpinner1Adapter = new SimpleCursorAdapter(
                    this,
                    android.R.layout.simple_list_item_1,
                    mSpinner1Csr,
                    new String[]{DatabaseHandler.KEY_NAME},
                    new int[]{android.R.id.text1},
                    0
            );
            mSpinner1.setAdapter(mSpinner1Adapter);
            mSpinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    manageSpinner2(mSpinner1Csr.getString(mSpinner1Csr.getColumnIndex(DatabaseHandler.ROUTE)));
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                }
            });
        } else {
            mSpinner1Adapter.swapCursor(mSpinner1Csr);
        }
    }
    private void manageSpinner2(String keyFromSpinner1) {
        mSpinner2Csr = mDH.getAllLabelsForSpinner2AsCursor(keyFromSpinner1);
        if (mSpinner2Adapter == null) {
            mSpinner2Adapter = new SimpleCursorAdapter(
                    this,
                    android.R.layout.simple_list_item_1,
                    mSpinner2Csr,
                    new String[]{DatabaseHandler.ROUTE},
                    new int[]{android.R.id.text1},
                    0
            );
            mSpinner2.setAdapter(mSpinner2Adapter);
            mSpinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    manageSpinner3(mSpinner2Csr.getString(mSpinner2Csr.getColumnIndex(DatabaseHandler.ROUTE)));
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {

                }
            });
        } else {
            mSpinner2Adapter.swapCursor(mSpinner2Csr);
        }
    }

    private void manageSpinner3(String keyForSpinner3) {
        mSpinner3Csr = mDH.getAllLabelsForSpinner3AsCursor(keyForSpinner3);
        if (mSpinner3Adapter == null) {
            mSpinner3Adapter = new SimpleCursorAdapter(
                    this,
                    android.R.layout.simple_list_item_1,
                    mSpinner3Csr,
                    new String[]{DatabaseHandler.KEY_ID},
                    new int[]{android.R.id.text1},
                    0
            );
            mSpinner3.setAdapter(mSpinner3Adapter);
        } else {
            mSpinner3Adapter.swapCursor(mSpinner3Csr);
        }
    }
}

数据库处理程序

public class DatabaseHandler extends SQLiteOpenHelper {
    // Database Version
    public static final int DATABASE_VERSION = 1;

    public static final String DATABASE_NAME = "spinnerExample";
    private final Context myContext;
    private SQLiteDatabase myDataBase;
    // Database Name
    // Labels table name
    public static final String TABLE_LABELS = "labels"; //<<<< Made public
    public static final String TABLE_LABELS1= "labels1";
    public static final String TABLE_LABELS2= "labels2";
    // Labels Table Columns names
    public static final String KEY_ID4 = "input_label";
    public static final String KEY_ID12 = "id2";           //<<<< Made public
    public static final String KEY_ID = "id";
    public static final String KEY_99 = "sno";           //<<<< Made public//<<<< Made public
    public static final String KEY_NAME = "name";       //<<<< made public
    public static final String KEY_ID1 = "id1";           //<<<< Made public
    public static final String KEY_NAME1 = "name1";
    public static final String KEY_1 = "number";           //<<<< Made public
    public static final String KEY_2 = "outletname";       //<<<< made public
    public static final String KEY_3 = "sunday";           //<<<< Made public
    public static final String KEY_4 = "monday";
    public static final String KEY_5 = "tuesday";
    public static final String KEY_6 = "wednesday";
    public static final String KEY_7 = "thursday";
    public static final String KEY_8 = "saturday";
    public static final String KEY_9 = "closed";
    public static final String KEY_10 = "calling";
    public static final String KEY_11 = "id3";
    public static final String ROUTE= "route";

    public DatabaseHandler(Context context) {

        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        myDataBase = this.getWritableDatabase();
        this.myContext = context;
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        //boolean dbExist = checkDataBase();
        // Category table create query
        String CREATE_CATEGORIES_TABLE = "CREATE TABLE " + TABLE_LABELS + "("+ KEY_99 + " INTEGER,"
                + ROUTE + " TEXT," + KEY_ID + " TEXT," + KEY_NAME + " TEXT)";
        String CREATE_CATEGORIES_TABLE1 = "CREATE TABLE " + TABLE_LABELS1 + "("
                + KEY_ID1+ " TEXT," + KEY_NAME1+ " TEXT)";
        String CREATE_CATEGORIES_TABLE2 = "CREATE TABLE " + TABLE_LABELS2 + "("
                + KEY_11+ " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_1+ " TEXT," + KEY_2+ " TEXT," + KEY_3+ " TEXT)";
        db.execSQL(CREATE_CATEGORIES_TABLE);
        db.execSQL(CREATE_CATEGORIES_TABLE1);
        db.execSQL(CREATE_CATEGORIES_TABLE2);
    }
    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LABELS);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LABELS1);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LABELS2);
        // Create tables again
        onCreate(db);
    }

    /**
     * Inserting new lable into lables table
     * */



public void insertlabel(String text,String id9,String id, String label) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(KEY_99,text);
    cv.put(ROUTE,id9);
    cv.put(KEY_ID,id);
    cv.put(KEY_NAME,label);
    db.insert(TABLE_LABELS,null,cv);
    db.close();
}


    public void insertLabel(String message1, String message2,String message3){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_1, message1);
        values.put(KEY_2, message2);
        values.put(KEY_3,message3);
        // Inserting Row
        db.insert(TABLE_LABELS2, null, values);
        //db.close(); // Closing database connection
    }

    public void insertLabel1(String label){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_NAME1, label);
        db.insert(TABLE_LABELS1, null, values);
        //db.close(); // Closing database connection
    }

    public void insertLabel2(String label){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, label);
        db.insert(TABLE_LABELS, null, values);
        db.close(); // Closing database connection
    }


    public Cursor getAllLabelsForSpinner1AsCursor() {
        String[] columns = new String[]{"rowid AS _id, *"}; // Need _id column for SimpleCursorAdapter
        return this.getWritableDatabase().query(TABLE_LABELS,columns,null,null,null,null,null);
    }


    public Cursor getAllLabelsForSpinner2AsCursor(String keyFromSinner1) {
        String[] columns = new String[]{"rowid AS _id, *"}; // Need _id column for SimpleCursorAdapter
        return this.getWritableDatabase().query(
                TABLE_LABELS,columns,
                DatabaseHandler.ROUTE + " LIKE ?",
                new String[]{keyFromSinner1+"%"},
                null,null,null
        );
    }

    public Cursor getAllLabelsForSpinner3AsCursor(String keyFromSpinner2) {
        String[] columns = new String[]{"rowid AS _id, *"}; // Need _id column for SimpleCursorAdapter
        return this.getWritableDatabase().query(
                TABLE_LABELS,columns,
                DatabaseHandler.ROUTE + " LIKE ?",
                new String[]{keyFromSpinner2 + "%"},
                null,null,null);
    }
}

模拟: 正如您可以在下面选择第一个微调器“P1”显示他的相关信息

现在第二个微调器显示基于第一个微调器选择的信息。

我们保存每个选择的信息。

要求微调器 2 信息应在数据保存信息时减少。

示例:如果您选择“9001234”,则使用“9001234”保存信息,下一个应该自动出现“9003562”,依此类推。

期待任何帮助。

【问题讨论】:

  • 也添加您的微调器适配器代码,以便更好地了解您到目前为止所做的工作。
  • @HaiderSaleem 微调器适配器详细信息已经可用..
  • 专家欢迎您的想法
  • @tynn 为您的困惑道歉。是的,我已经按照我的要求提供了信息。如果你愿意,我可以再改一下。当然,非常感谢确实花时间在我的问题上..
  • @mikeT 你能用你的专业知识找到答案吗?

标签: android database android-sqlite android-spinner


【解决方案1】:

这个怎么样?

public Cursor getRoutes(long name) {
    SQLiteDatabase db = this.getReadableDatabase();
    String whereclause = KEY_NAME + "=?";
    String[] whereargs = new String[]{String.valueOf(name)};
    String sql = "SELECT customer_name,labels5.number,labels.id,customer._id,labels.route FROM customer left join labels ON customer._id = labels._id  LEFT JOIN labels5 ON labels5.number =  labels.route WHERE number IS NULL";
    return db.query(sql,null,whereclause,whereargs,null,null,ROUTE);
}

【讨论】:

  • 即使它可能有效,这些别名也会令人困惑——而且 code-sn-ps 对 SQL 毫无用处。
  • @Leace 上述示例在 OP 中的问题是,条目不是从数据库加载的,因此即使不是不可能,创建级联下拉列表也是相当困难的。 . 根本没有什么可以运行 SQL。
  • @Mecido 出现以下错误。 android.database.sqlite.SQLiteException:靠近“SELECT”:语法错误(代码 1 SQLITE_ERROR[1]):,编译时:SELECT * FROM SELECT customer_name,labels5.number,labels.id,customer._id,labels.route FROM客户左连接标签上客户._id = 标签._id 左连接标签5 上标签5.编号 = 标签.路由 WHERE number IS NULL WHERE _id=?按路线订购
【解决方案2】:

第二种方式

public Cursor getRoutes(long name) {
    SQLiteDatabase db = this.getReadableDatabase();
    String whereclause = KEY_NAME + "=?";
    String[] whereargs = new String[]{String.valueOf(name)};
    String[] tableColumns = new String[]{"customer_name, labels5.number,labels.id,customer._id,labels.route FROM customer left join labels ON customer._id = labels._id  LEFT JOIN labels5 ON labels5.number =  labels.route where number is NULL "};
    //String orderBy = "ROUTE";
  // String tableColumns = SELECT customer_name, labels5.number,labels.id,customer._id,labels.route FROM customer left join labels ON customer._id = labels._id  LEFT JOIN labels5 ON labels5.number =  labels.route where number is NULL"  ;
    return db.query(TABLE_LABELS,tableColumns,whereclause,whereargs,null,null,ROUTE);
}

【讨论】:

  • 错误:android.database.sqlite.SQLiteException:靠近“FROM”:语法错误(代码 1 SQLITE_ERROR[1]):,编译时:SELECT customer_name、labels5.number、labels.id、customer ._id,labels.route FROM customer left join labels ON customer._id = labels._id LEFT JOIN labels5 ON labels5.number = labels.route where number is NULL FROM labels WHERE _id=? ORDER BY 路由在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
猜你喜欢
  • 2014-10-21
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
相关资源
最近更新 更多