2017-12-22 4 views
2

Ich mache eine "Zuletzt gespielte" Playlist in meiner Musik-App. Ich habe eine Datenbank zum Speichern der Informationen zu Liedern erstellt. Was mein aktueller Code macht, ist, wenn ich ein Lied spiele, füge ich es der Datenbank hinzu und ich kann es erfolgreich anzeigen. Aber das Problem ist, wenn ich denselben Song zweimal spiele, wird die Datenbank nicht aktualisiert. Beispiel, spielte ich Lied A, Lied B, Lied C, Lied D beziehungsweise. Dann wird Song A, Song B, Song C, Song D angezeigt. Aber wenn ich Song A, Song B, Song C, Song D und Song B wieder spiele. Dann zeigt es wieder dasselbe an (Lied A, Lied B, Lied C, Lied D). Aber was ich will ist: Lied A, Lied C, Lied D, Lied B. Es sollte aktualisieren und zeigen das neueste Lied gespielt, das ist, was ich meinte. Ich kann nicht herausfinden, wie es geht.Fügen Sie Daten in die Tabelle ein und wenn bereits vorhanden, bringen Sie sie nach oben SQLite

-Code für das Erstellen von Tabellen:

public void onCreate(SQLiteDatabase sqLiteDatabase) { 

    String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME+ "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," 
      + KEY_NAME + " TEXT," 
      + KEY_ARTIST + " TEXT," 
      + KEY_DURATION + " INTEGER," 
      + KEY_ART + " TEXT" 
      + ");"; 

    sqLiteDatabase.execSQL(CREATE_TABLE); 

} 

-Code für das Abrufen und Anzeigen der Daten:

public ArrayList<SongInfoModel> getRecentlyPlayed(){ 

    ArrayList<SongInfoModel> rpList = new ArrayList<>(); 
    String selectQuery = "SELECT * FROM " + TABLE_NAME; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery,null); 
    if(cursor.moveToFirst()){ 

     do{ 

      long id = cursor.getLong(0); 
      String SongName = cursor.getString(1); 
      String artistName = cursor.getString(2); 
      long dur = cursor.getLong(3); 
      String Art = cursor.getString(4); 

      SongInfoModel sh = new SongInfoModel(id,SongName,artistName,dur,null,Art); 

      rpList.add(sh); 
     }while (cursor.moveToNext()); 
    } 

    return rpList; 

-Code für Daten hinzufügen:

public void addSong(SongInfoModel songInfoModel){ 

     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(KEY_ID, songInfoModel.getSongID()); 
     values.put(KEY_NAME, songInfoModel.getSongName()); 
     values.put(KEY_ARTIST, songInfoModel.getArtistName()); 
     values.put(KEY_DURATION, songInfoModel.getDuration()); 
     values.put(KEY_ART, songInfoModel.getAlbumIDArtwork()); 

     db.insert(TABLE_NAME,null,values); 
     db.close(); 

    } 
+0

versuchen Sie diese Sammlungen.rückwärts (deineListe); –

+0

Sie haben eine Liste von Liedern, die im String-Array sind, und dann die, die in 'media player' abgespielt werden. Machen Sie eine andere Liste und fügen Sie sie hinzu. –

Antwort

0

Ändern Sie Ihre Tabellenabfrage innerhalb Semikolon trailing die Erstellungsabfrage ")";

String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME+ "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," 
      + KEY_NAME + " TEXT," 
      + KEY_ARTIST + " TEXT," 
      + KEY_DURATION + " INTEGER," 
      + KEY_ART + " TEXT" 
      + ")"; 

    sqLiteDatabase.execSQL(CREATE_TABLE); 
+0

ok, ich werde versuchen und Sie wissen lassen – Rektirino

+0

Kein Unterschied, es ist das gleiche. – Rektirino

0

Was mir in den Sinn kommt, ist ein Feld hinzuzufügen, die die Anzahl, wie oft gespielt zeigt, lässt KEY_TIMES sagen.

Wenn ein Song

  • Wenn sein bereits dort überprüft Hinzufügen, wenn es dort das Feld
  • ist aktualisieren Wenn nicht auf Standardwert mit dem Feld hinzuzufügen.

schließlich für immer die Werte nur die gleiche Abfrage verwenden, aber Bestellung von diesem neuen Gebiet:

String selectQuery = "SELECT * FROM " + TABLE_NAME + " ORDER BY " + KEY_TIMES; 

den Tischgebrauch zu erstellen:

public void onCreate(SQLiteDatabase sqLiteDatabase) { 
    String CREATE_TABLE = 
    "CREATE TABLE " + TABLE_NAME+ "(" + 
     KEY_ID + " INTEGER PRIMARY KEY," + 
     KEY_NAME + " TEXT," + 
     KEY_ARTIST + " TEXT," + 
     KEY_DURATION + " INTEGER," + 
     KEY_LAST_PLAYED + " INTEGER," + 
     KEY_TIMES + " INTEGER," + 
     KEY_ART + " TEXT" + ");"; 

    sqLiteDatabase.execSQL(CREATE_TABLE); 
} 

Und dann, wenn Sie Wenn Sie einen Song hinzufügen möchten, erstellen Sie eine Abfrage mit der ID, die Sie hinzufügen möchten. Wenn die Abfrage einen Eintrag in der Tabelle zurückgibt, erstellen Sie eine Abfrage, um das Feld KEY_TIMES zu aktualisieren. Wenn es keinen Eintrag zurückgibt, führe die Einfügung so aus, wie du es gerade machst, aber füge das neue Feld hinzu. (Sie können jetzt keinen Code dafür angeben)

+0

Können Sie mir einen Code geben? – Rektirino

+0

Überprüfung bearbeiten. Kann jetzt nicht mehr – Ivan

0

Sie können Ihrem Code ein lastPlayed-Datumsfeld hinzufügen. So sieht es aus.

public void onCreate(SQLiteDatabase sqLiteDatabase) { 
    String CREATE_TABLE = 
    "CREATE TABLE " + TABLE_NAME+ "(" + 
     KEY_ID + " INTEGER PRIMARY KEY," + 
     KEY_NAME + " TEXT," + 
     KEY_ARTIST + " TEXT," + 
     KEY_DURATION + " INTEGER," + 
     KEY_LAST_PLAYED + " INTEGER," + 
     KEY_ART + " TEXT" + ");"; 

    sqLiteDatabase.execSQL(CREATE_TABLE); 
} 

Ihr Code, um die Daten für die Anzeige wie folgt aussehen und stellen Sie sicher, von zuletzt zu bestellen gespielt:

public ArrayList<SongInfoModel getRecentlyPlayed() { 
    ArrayList<SongInfoModel> rpList = new ArrayList<>(); 
    String selectQuery = "SELECT * FROM " + TABLE_NAME + " ORDER BY " + KEY_LAST_PLAYED + " ASC;"; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery,null); 
    if(cursor.moveToFirst()){ 
     do{ 
      long id = cursor.getLong(0); 
      String SongName = cursor.getString(1); 
      String artistName = cursor.getString(2); 
      long dur = cursor.getLong(3); 
      String Art = cursor.getString(5); 
      SongInfoModel sh = new SongInfoModel(id,SongName,artistName,dur,null,Art); 
      rpList.add(sh); 
     }while (cursor.moveToNext()); 
} 
return rpList; 
} 

Und für Ihre Codedaten hinzugefügt:

public void addSong(SongInfoModel songInfoModel){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_ID, songInfoModel.getSongID()); 
    values.put(KEY_NAME, songInfoModel.getSongName()); 
    values.put(KEY_ARTIST, songInfoModel.getArtistName()); 
    values.put(KEY_DURATION, songInfoModel.getDuration()); 
    values.put(KEY_LAST_PLAYED, new Date().getTime()); 
    values.put(KEY_ART, songInfoModel.getAlbumIDArtwork()); 
    db.insert(TABLE_NAME,null,values); 
    db.close(); 
} 

Diese Kombination wird Holen Sie sich die Daten in der Reihenfolge zuletzt gespielt.

+0

values.put (KEY_LAST_PLAYED, neues Date(). GetTime()); Ist es eine eingebaute Klasse in Android? neues Datum()?? – Rektirino

+0

Ich denke, es ist gerade eine Java-Klasse –

+0

ok Lemma versuchen, schlecht aktualisieren Sie – Rektirino

Verwandte Themen