【问题标题】:SQLite with ArrayList and ArrayAdapter带有 ArrayList 和 ArrayAdapter 的 SQLite
【发布时间】:2012-10-11 17:18:29
【问题描述】:

你能告诉我这段代码有什么问题吗?它运行但结果未列出。我只想要一个简单的 SQLiteDB 运行测试来完成我的另一个项目。我认为 ArrayList 的使用有问题。

public class MainActivity extends Activity {

String names;
ListView lvMain;
ArrayList<String> values;
ArrayAdapter<String> adapter;

DBHelper dbHelper;
EditText et;
Button btnAdd;
Button btnRead;
Button btnClear;
Button btnShow;

Cursor c;
int nameColIndex;
int idColIndex;

/**
 * Called when the activity is first created.
 */
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    btnAdd = (Button) findViewById(R.id.btnAdd);
    btnRead = (Button) findViewById(R.id.btnRead);
    btnClear = (Button) findViewById(R.id.btnClear);
    btnShow = (Button) findViewById(R.id.btnShow);

    dbHelper = new DBHelper(this);
    lvMain = (ListView) findViewById(R.id.lvMain);
    values = new ArrayList<String>();

}

public void onButtonClick(View v) {

    ContentValues cv = new ContentValues();
    String name = et.getText().toString();
    SQLiteDatabase db = dbHelper.getWritableDatabase();

    switch (v.getId()) {

        case R.id.btnAdd:
            cv.put("name", name);

            // вставляем запись и получаем ее ID
            long rowID = db.insert("mytable", null, cv);

            break;

        case R.id.btnRead:

            // делаем запрос всех данных из таблицы mytable, получаем Cursor 
            c = db.query("mytable", null, null, null, null, null, null);

            // ставим позицию курсора на первую строку выборки
            // если в выборке нет строк, вернется false
            if (c.moveToFirst()) {

                // определяем номера столбцов по имени в выборке
                idColIndex = c.getColumnIndex("id");
                nameColIndex = c.getColumnIndex("name");

                do {
                    // получаем значения по номерам столбцов

                    c.getInt(idColIndex);

                names = c.getString(nameColIndex);

                values.add(names);

                    // переход на следующую строку 
                    // а если следующей нет (текущая - последняя), то false - выходим из цикла
                } while (c.moveToNext());

            } else {
                c.close();
            }

            break;

        case R.id.btnClear:

            // удаляем все записи
            int clearCount = db.delete("mytable", null, null);

            break;

        case R.id.btnShow:
            break;
    }

// закрываем подключение к БД

    adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, values);

    lvMain.setAdapter(adapter);


    dbHelper.close();     

    adapter.notifyDataSetChanged();

}

 class DBHelper extends SQLiteOpenHelper {

public DBHelper(Context context) {
  // конструктор суперкласса
  super(context, "myDB", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {

  // создаем таблицу с полями
  db.execSQL("create table mytable ("
      + "id integer primary key autoincrement," 
      + "name text,"
      + "email text" + ");");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

} }

Here is main, may be I am missing something?

    `<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Name"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp">
            </TextView>
            <EditText
                android:id="@+id/et"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1">
                <requestFocus>
                </requestFocus>
            </EditText>
        </LinearLayout>
        <LinearLayout
            android:id="@+id/linearLayout2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <Button
                android:id="@+id/btnAdd"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="onButtonClick"
                android:text="Add">
            </Button>
            <Button
                android:id="@+id/btnRead"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="onButtonClick"
                android:text="Read">
            </Button>
            <Button
                android:id="@+id/btnClear"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="onButtonClick"
                android:text="Clear">
            </Button>
            <Button
                android:id="@+id/btnShow"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="onButtonClick"
                android:text="Show">
            </Button>
        </LinearLayout>
         <ListView
            android:id="@+id/lvMain"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </ListView>
    </LinearLayout>`

【问题讨论】:

    标签: android sqlite arraylist android-arrayadapter


    【解决方案1】:
    values = new ArrayList<String>();
    

    valuesnull

    变化:

    dbHelper = new DBHelper(this);
               lvMain = (ListView) findViewById(R.id.lvMain);
               values = new ArrayList<String>();
    
        }
    
        public void onButtonClick(View v) {
    
            ContentValues cv = new ContentValues();
            String name = et.getText().toString();
            SQLiteDatabase db = dbHelper.getWritableDatabase();
    
            switch (v.getId()) {
                case R.id.btnAdd:
                    cv.put("name", name);
                    long rowID = db.insert("mytable", null, cv);
                    break;
    
                case R.id.btnRead:
                    c = db.query("mytable", null, null, null, null, null, null);
                    if (c.moveToFirst()) {
                        idColIndex = c.getColumnIndex("id");
                        nameColIndex = c.getColumnIndex("name");
    
                        do {
                            c.getInt(idColIndex);
                        names = c.getString(nameColIndex);
                        values.add(names);
                        } while (c.moveToNext());
                    } else {
                        c.close();
                    }
                    break;
    
                case R.id.btnClear:
                    int clearCount = db.delete("mytable", null, null);
                    break;
    
                case R.id.btnShow:
                    break;
            }
    adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, values);
            lvMain.setAdapter(adapter);
        dbHelper.close();     
        adapter.notifyDataSetChanged(); 
    
    
    
    }
    

    }

    【讨论】:

    • 我已经按照您的建议进行了尝试。 Evene 将 DBHelper 放入 MainActivity。当我按下添加时,App.crash。
    • 我已经想通了。感谢大家的时间和努力。
    【解决方案2】:

    尝试拨打ArrayAdapter.notifyDataSetChanged()。这告诉ListView,基础数据已更改,它应该失效。

    【讨论】:

    • 我做到了,但仍然无法得到它。
    • 你能发布你更新的代码吗?或者使用适配器的add 方法。
    • 已添加 main.xml。可能是我错过了什么。
    • 你在哪里调用db.open()方法
    【解决方案3】:

    在 onClick() 方法的最后尝试调用adapter.notifyDataSetChanged(); 这会刷新所有正在使用适配器为视图设置值的视图。

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多