我无法在Android中从SQLite DB填充ListView。我已经阅读了很多关于这个问题的博客和网页,但是我没有得到一个好的结果。如何从SQLite数据库填充ListView?
我不明白为什么,但我的脚本无法通过行后面传递:“// #### ERROR COMES FROM NEXT LINE ####”,其中我为适配器分配一个值。
这些都是我的文件:
活动文件:
public class Qualificacions extends AppCompatActivity {
//Atributs
private Fitxer f = new Fitxer(this);
private Resultats res = new Resultats();
private AdaptadorBD assistentBD;
private SimpleCursorAdapter adaptadorDades;
private ListView p7lv1;
private EditText p7et1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qualificacions);
assistentBD = new AdaptadorBD(this);
assistentBD.obre();
try {
mostraLlista();
} catch (Exception e) {
StackTraceElement ste[] = e.getStackTrace();
String s = "";
for (StackTraceElement el : ste)
s += String.format("\n\t\t%s", el);
f.mostraMissatge(s);
}
}
private void mostraLlista() {
//Cursor cursor = assistentBD.classificació("Igor");
Cursor cursor = assistentBD.mostraBaseDeDades();
String columnes[] = new String[] {
AdaptadorBD.CLAU_DATA,
AdaptadorBD.CLAU_USUARI,
AdaptadorBD.CLAU_PUNTS,
AdaptadorBD.CLAU_TEMPS
};
int columnesXML[] = new int[] {
R.id.data,
R.id.usuari,
R.id.puntuació,
R.id.temps
};
//#### ERROR COMES FROM NEXT LINE ####
adaptadorDades = new SimpleCursorAdapter(
this,
R.layout.activity_columnes,
cursor,
columnes,
columnesXML,
0
);
p7lv1 = (ListView) findViewById(R.id.p7lv1);
p7lv1.setAdapter(adaptadorDades);
p7lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Cursor cursor = (Cursor) p7lv1.getItemAtPosition(i);
String usuari = cursor.getString(cursor.getColumnIndexOrThrow("usuari"));
Toast.makeText(getApplicationContext(), usuari, Toast.LENGTH_SHORT).show();
}
});
p7et1 = (EditText) findViewById(R.id.p7et1);
p7et1.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s){
}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
adaptadorDades.getFilter().filter(s.toString());
}
});
adaptadorDades.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence seq) {
return assistentBD.classificació(seq.toString());
}
});
}
}
CursorAdapter的文件:
public class AdaptadorBD {
public static final String CLAU_DATA = "data";
public static final String CLAU_USUARI = "usuari";
public static final String CLAU_PUNTS = "puntuació";
public static final String CLAU_TEMPS = "temps";
private static final String ETIQUETA = "AdaptadorBD";
private AssistentBD assistentBD;
private SQLiteDatabase baseDeDades;
private static final String NOM_BASE_DE_DADES = "BaseDades";
private static final String NOM_TAULA = "taula_qualificacions";
private final Context mCtx;
private static final String CREA_BASE_DE_DADES = "CREATE TABLE IF NOT EXISTS taula_qualificacions(data INT PRIMARY KEY, usuari TEXT, puntuació INT, temps INT)";
private static class AssistentBD extends SQLiteOpenHelper {
AssistentBD(Context context) {
super(context, NOM_BASE_DE_DADES, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.w(ETIQUETA, CREA_BASE_DE_DADES);
db.execSQL(CREA_BASE_DE_DADES);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(ETIQUETA, "Actualitzant base de dades a la versió...");
//db.execSQL("DROP TABLE IF EXISTS " + NOM_TAULA);
}
}
public AdaptadorBD(Context ctx){
this.mCtx = ctx;
}
public AdaptadorBD obre() throws SQLException {
assistentBD = new AssistentBD(mCtx);
baseDeDades = assistentBD.getWritableDatabase();
return this;
}
public void tanca() {
if (assistentBD != null) assistentBD.close();
}
public long nouRegistre(String data, String usuari, String puntuació, String temps) {
ContentValues initValues = new ContentValues();
initValues.put(CLAU_DATA, data);
initValues.put(CLAU_USUARI, usuari);
initValues.put(CLAU_PUNTS, puntuació);
initValues.put(CLAU_TEMPS, temps);
return baseDeDades.insert(NOM_TAULA, null, initValues);
}
public long nouRegistre(long data, String usuari, int puntuació, long temps) {
String cadData = String.valueOf(data);
cadData = String.format(
"%3$s/%2$s/%1$s %4$s:%5$s",
cadData.substring(0, 4), //any
cadData.substring(3, 6), //mes
cadData.substring(5, 8), //dia
cadData.substring(7, 10), //hora
cadData.substring(9, 12) //minut
);
ContentValues initValues = new ContentValues();
initValues.put(CLAU_DATA, data);
initValues.put(CLAU_USUARI, usuari);
initValues.put(CLAU_PUNTS, puntuació);
initValues.put(CLAU_TEMPS, temps);
return baseDeDades.insert(NOM_TAULA, null, initValues);
}
public boolean esborraRegistresTaula(){
int fet = 0;
fet = baseDeDades.delete(NOM_TAULA, null, null);
Log.w(ETIQUETA, Integer.toString(fet));
return fet > 0;
}
public boolean esborraRegistesUsuari(String usuari){
String [] usuaris = usuari.split(", ?");
int done = 0;
done = baseDeDades.delete(NOM_TAULA, "usuari=?", usuaris);
Log.w(ETIQUETA, Integer.toString(done));
return done > 0;
}
public Cursor classificació(String usuari){
String usuaris[] = new String[] {usuari};
String[] camps = new String[] {"data", "usuari", "puntuació", "temps"};
Cursor cursor = baseDeDades.query(
NOM_TAULA,
camps,
"usuari=?",
new String[] {usuari},
null,
null,
"puntuació DESC, temps ASC",
"10"
);
if (cursor != null) cursor.moveToFirst();
return cursor;
}
public Cursor classificació(){
Cursor cursor = baseDeDades.rawQuery(
"SELECT data, usuari, puntuació, temps FROM taula_qualificacions WHERE " +
"usuari='Igor' ORDER BY puntuació DESC, temps ASC LIMIT 10;", null
);
if (cursor != null) cursor.moveToFirst();
return cursor;
}
public Cursor mostraBaseDeDades() {
String camps[] = new String[] {"data", "usuari", "puntuació", "temps"};
Cursor cursor = baseDeDades.query(
NOM_TAULA,
camps,
null,
null,
null,
null,
null
);
return cursor;
}
}
TextViews填补ListView的项目:
public class Columnes extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_columnes);
}
}
而其respec略去xml文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cat.memoriacastello.www.memoriahistorica.Columnes"
tools:layout_editor_absoluteY="81dp"
tools:layout_editor_absoluteX="0dp">
<TextView
android:id="@+id/p9tv1"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_marginEnd="36dp"
android:layout_marginStart="34dp"
android:hint="Data"
android:text="Data:"
tools:layout_constraintRight_creator="1"
app:layout_constraintRight_toRightOf="@+id/data"
app:layout_constraintBaseline_toBaselineOf="@+id/data"
tools:layout_constraintBaseline_creator="1"
tools:layout_constraintLeft_creator="1"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginLeft="34dp"
android:layout_marginRight="36dp" />
<TextView
android:id="@+id/p9tv2"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:hint="Nom"
android:text="Nom:"
tools:layout_constraintRight_creator="1"
app:layout_constraintRight_toRightOf="@+id/p9tv1"
app:layout_constraintBaseline_toBaselineOf="@+id/usuari"
tools:layout_constraintBaseline_creator="1"
tools:layout_constraintLeft_creator="1"
app:layout_constraintLeft_toLeftOf="@+id/p9tv1" />
<TextView
android:id="@+id/p9tv3"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:hint="Puntuació"
android:text="Puntuació:"
tools:layout_constraintTop_creator="1"
tools:layout_constraintRight_creator="1"
app:layout_constraintRight_toRightOf="@+id/p9tv2"
android:layout_marginTop="6dp"
app:layout_constraintTop_toBottomOf="@+id/p9tv2"
tools:layout_constraintLeft_creator="1"
app:layout_constraintLeft_toLeftOf="@+id/p9tv2" />
<TextView
android:id="@+id/p9tv4"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:hint="Temps"
android:text="Temps:"
tools:layout_constraintTop_creator="1"
tools:layout_constraintRight_creator="1"
app:layout_constraintRight_toRightOf="@+id/p9tv3"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/p9tv3"
tools:layout_constraintLeft_creator="1"
app:layout_constraintLeft_toLeftOf="@+id/p9tv3" />
<TextView
android:id="@+id/data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Data"
android:layout_marginStart="111dp"
tools:layout_constraintTop_creator="1"
android:layout_marginTop="49dp"
tools:layout_constraintLeft_creator="1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginLeft="111dp" />
<TextView
android:id="@+id/usuari"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Nom"
tools:layout_constraintTop_creator="1"
android:layout_marginStart="1dp"
android:layout_marginTop="7dp"
app:layout_constraintTop_toBottomOf="@+id/data"
tools:layout_constraintLeft_creator="1"
app:layout_constraintLeft_toLeftOf="@+id/puntuació"
android:layout_marginLeft="1dp" />
<TextView
android:id="@+id/puntuació"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Puntuació"
tools:layout_constraintRight_creator="1"
app:layout_constraintRight_toRightOf="@+id/data"
app:layout_constraintBaseline_toBaselineOf="@+id/p9tv3"
tools:layout_constraintBaseline_creator="1"
tools:layout_constraintLeft_creator="1"
app:layout_constraintLeft_toRightOf="@+id/data" />
<TextView
android:id="@+id/temps"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="7dp"
android:hint="Temps"
app:layout_constraintBaseline_toBaselineOf="@+id/p9tv4"
tools:layout_constraintBaseline_creator="1"
tools:layout_constraintLeft_creator="1"
app:layout_constraintLeft_toRightOf="@+id/p9tv4"
android:layout_marginLeft="20dp" />
</android.support.constraint.ConstraintLayout>
你可以找到我们的[github上的项目]整个代码 (https://github.com/oscarbenages/MemHist/tree/master/app/src/main/java/cat/memoriacastello/www/memoriahistorica “MemHist项目”)。
有人可以帮忙吗?
看看[stack trace](http://stackoverflow.com/questions/23353173)来确定问题。我有一种感觉是这样的:https://stackoverflow.com/questions/3359414。 –
它看起来并不像你有一个名为** _ id **的列,cursorAdapters需要一个。也许可以将'rowid as _id'或'data as _id'加入'String camps [] = new String [] {“rowid as _id”,“data”,“usuari”,“puntuació”,“temps”};' – MikeT
好的,谢谢!它工作正常! –