Как проверить, что спиннер пуст? - PullRequest
0 голосов
/ 04 сентября 2018

Мне нужно проверить, пуст ли мой счетчик. Но когда внутри прядильщика есть данные, они все еще показывают, что они пустые, не содержат никаких данных. Основная проблема заключается в том, что счетчик уже содержит данные из базы данных, но программа продолжает добавлять новые данные после повторного открытия приложения.

Основная деятельность

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    spinner = (Spinner) findViewById(R.id.spinner);
    databaseHelper db = new databaseHelper(getApplicationContext());


    if (spinner.getCount() == 0){
        Toast.makeText(MainActivity.this,"Spinner will be populated now",Toast.LENGTH_LONG).show();
        db.insertData();
    }else {
        Toast.makeText(MainActivity.this,"Spinners is already populated",Toast.LENGTH_LONG).show();
    }
    loadData();
}

public void loadData(){
    databaseHelper db = new databaseHelper(getApplicationContext());
    List<String> labels = db.getAllLabels();
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, labels);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(dataAdapter);
}

@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    String label = adapterView.getItemAtPosition(i).toString();
    Toast.makeText(adapterView.getContext(),"Selected: "+label,Toast.LENGTH_LONG).show();
}

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

}
}

База данных

public databaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_2 + " TEXT," + COLUMN_3 + " TEXT," + COLUMN_4 + " TEXT)");

}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

public boolean insertData() {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_2, "1");
    contentValues.put(COLUMN_3, "2");
    contentValues.put(COLUMN_4, "3");
    long result = db.insert(TABLE_NAME, null, contentValues);

    if (result == -1) {
        return false;
    } else
        return true;
}

public List<String> getAllLabels() {
    List<String> labels = new ArrayList<String>();

    String selectQuery = "SELECT  * FROM " + TABLE_NAME;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            labels.add(cursor.getString(1));
            labels.add(cursor.getString(2));
            labels.add(cursor.getString(3));
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();

    return labels;
}
}

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Я проверил ваш код и всегда вызываю db.insertData (), потому что в начале счетчик getCount всегда равен 0.

Итак, я позволил вам внести некоторые изменения, которые я сделал в вашей MainActivity, а также создал метод в классе Database, чтобы узнать, когда мне нужно заполнить базу данных или нет.

MainActivity

public class MainActivity extends AppCompatActivity implements Spinner.OnItemSelectedListener{
    private Spinner spinner;
    private Database db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

            spinner = findViewById(R.id.spinner);
            db  = new Database(getApplicationContext());

            if(db.shouldPopulate()){
                db.insertData();
            }

            loadData();
        }

    public void loadData(){
        List<String> labels = db.getAllLabels();

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, labels);

        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setOnItemSelectedListener(this);
        spinner.setAdapter(dataAdapter);

    }

        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            String label = adapterView.getItemAtPosition(i).toString();
            Toast.makeText(adapterView.getContext(),"Selected: "+label,Toast.LENGTH_LONG).show();
        }

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

        }
}

База данных Здесь я изменил условие результата в методе insertData для результата вставки.

И я создал метод, чтобы знать, когда вы должны вставить данные.

public boolean insertData() {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COLUMN_2, "1");
        contentValues.put(COLUMN_3, "2");
        contentValues.put(COLUMN_4, "3");

        return db.insert(TABLE_NAME, null, contentValues) != -1;
    }

    public boolean shouldPopulate(){
        return  getAllLabels().isEmpty();
    }

Надеюсь, этот код поможет вам.

ВАЖНО

Вы должны обернуть свои вызовы БД в фоновый обработчик, это очень важно в приложениях для Android для повышения производительности и рекомендаций.

0 голосов
/ 04 сентября 2018

Где вы добавляете данные к вашему счетчику? Вы просто заявляете это:

spinner = (Spinner) findViewById(R.id.spinner);

Вы должны использовать Адаптер для добавления данных в Spinner:

// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
        R.array.planets_array, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);

А что означает spinner.getCount()? Может быть, это относится к adapter?

0 голосов
/ 04 сентября 2018

Вы не должны выполнять трудоемкие работы, такие как вызов базы данных из основного потока приложения. вызовите db асинхронно, например, используйте AsyncTask.

Вы можете получить счетчик вращающихся предметов следующим образом:

int count = spinner.getAdapter() != null ? spinner.getAdapter().getCount() : 0;
...