2017-09-06 144 views
-1

我无法在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项目”)。

有人可以帮忙吗?

+0

看看[stack trace](http://stackoverflow.com/questions/23353173)来确定问题。我有一种感觉是这样的:https://stackoverflow.com/questions/3359414。 –

+0

它看起来并不像你有一个名为** _ id **的列,cursorAdapters需要一个。也许可以将'rowid as _id'或'data as _id'加入'String camps [] = new String [] {“rowid as _id”,“data”,“usuari”,“puntuació”,“temps”};' – MikeT

+0

好的,谢谢!它工作正常! –

回答

-1

这是我在自定义数据库处理程序类中使用的代码。它返回一个Soldier数组。士兵是一个简单的类,只有3个属性在数据库中。你可以看到它调用了游标,并通过将每个士兵添加到它返回的数组“cap”来循环。

public class SoldierDbHandler extends SQLiteOpenHelper { 
...... 

public Soldier[] getCurrentSoldierArray() { 


    String Data = ""; 
    int counter = 0; 

    //Global variable to determine how many Soldiers there are. 

    Player player = Player.getInstance(); 

    Soldier[] cap = new Soldier[player.getNumberOfCurrentSoldiers()]; 

    try { 
     SQLiteDatabase testDB = getWritableDatabase(); 

     //Retrieve Data from database 

     Cursor c = testDB.rawQuery("SELECT * FROM " + 
     TABLE_CURRENT_SOLDIERS, null); 

     int stringZero = c.getColumnIndex("_id"); 
     int stringOne = c.getColumnIndex("soldtitle"); 
     int stringTwo = c.getColumnIndex("soldmissionscomp"); 

     c.moveToFirst(); 


     if (c != null) { 
      //Loop through the fields 
      do { 

       Soldier sold2 = new Soldier(1, "", 0, 0, 0, 0, 0); 

       int zero = c.getInt(stringZero); 
       String first = c.getString(stringOne); 
       int second = c.getInt(stringTwo); 

       sold2.setIdOfSold(zero); 
       sold2.setTitle(first); 
       sold2.setSoldierCompletedMissions(second); 

       cap[counter] = sold2; 

       counter++; 
      } while (c.moveToNext()); 


     } 

     testDB.close(); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 



    } 


    return cap; 

} 

然后我把它传递给我的适配器中的片段我想显示我所有的士兵。

dbHandler = new SoldierDbHandler(getActivity(), null, null, 1); 

    soldier_data = dbHandler.getCurrentSoldierArray(); 

    final SoldierAdapter adapter = new 
    SoldierAdapter(getActivity(),R.layout.listview_soldier_row, 
    soldier_data); 

    playersCurrentSoldierListViewAB = 
    (ListView)rootView.findViewById(R.id.playersCurrentSoldListViewC); 

    playersCurrentSoldierListViewAB.setAdapter(adapter); 

您是否已成功检索数据库中的至少一条数据?我会建立一个简单的方法来保存,然后再尝试和回忆一列。