2014-11-01 12 views
0

Я не уверен, почему, но каждый элемент в моей базе данных дублируется примерно 30 раз, хотя я только вставляю каждый элемент один раз. Я думал, возможно, это может быть результатом метода walkdir(), который вставляет в базу данных для каждого файла с расширением .mp3 в указанной корневой папке или, возможно, в результате моей наивности в отношении утилизации ListView.SQLite insert добавляет одну и ту же запись несколько раз

public class SQLHelper extends SQLiteOpenHelper{ 
    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "MusicDatabase.db"; 
    private static final String SQL_CREATE_TABLE = 
      "CREATE TABLE "+ 
        FeedEntry.TABLE_NAME+" ("+ 
        FeedEntry._ID+" INTEGER PRIMARY KEY,"+ 
        FeedEntry.KEY_FILENAME+" TEXT UNIQUE,"+ 
        FeedEntry.KEY_SONGNAME+" TEXT)"; 
    private static final String SQL_DELETE_TABLE = "DROP TABLE IF EXISTS "+ SQLContract.FeedEntry.TABLE_NAME; 

    public SQLHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(SQL_CREATE_TABLE); 
    } 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL(SQL_DELETE_TABLE); 
     onCreate(db); 
    } 
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     onUpgrade(db, oldVersion, newVersion); 
    }/* 
    public List<Song> getAllSongs(){ 
     List<Song> songs = new LinkedList<Song>(); 
     String query = "SELECT * FROM "+FeedEntry.TABLE_NAME; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(query,null); 
     Song song = null; 
     if(cursor.moveToFirst()){ 
      do { 
       song = new Song(); 
       song.setId(Integer.parseInt(cursor.getString(0))); 
       song.setFileName(cursor.getString(1)); 
       song.setSongName(cursor.getString(2)); 
       songs.add(song); 
      }while(cursor.moveToNext()); 
     } 
     return songs; 
    }*/ 
    public void addSong(File file){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(FeedEntry.KEY_FILENAME, file.getPath()); 
     values.put(FeedEntry.KEY_SONGNAME, file.getName()); 
     db.insert(FeedEntry.TABLE_NAME,null,values); 
    } 
    public Cursor read(String sort, String direction){ 
     SQLiteDatabase db = this.getReadableDatabase(); 
     String[] projection = { 
      FeedEntry._ID, 
      FeedEntry.KEY_FILENAME, 
      FeedEntry.KEY_SONGNAME, 
     }; 
     String sortOrder = sort+direction; 
     Cursor c = db.query(
       FeedEntry.TABLE_NAME, 
       projection,null,null,null,null, 
       sortOrder 
     ); 
     return c; 
    } 
} 
+0

Вы предполагаете, что мы все знаем, о чем вы говорите, или я пропустил последний эпизод или что-то в этом роде. – eduyayo

+0

Код для вставки, кажется, в порядке. Каково содержание корневого каталога и что повторяется в списке? – eduyayo

+0

И когда называется 'walkdir'? –

ответ

0

После долгих проб и неудач я обнаружил, что ошибка в моем коде лежит здесь:

public static final String DATABASE_NAME = "MusicDatabase.db"; 

Должно быть:

public static final String DATABASE_NAME = "MusicDatabase"; 

Я понятия не имею, почему я думал, расширение базы данных было необходимо.

0

Я думаю, что проблема не возникает в вашем коде базы данных.

Я чувствую, ваша проблема очень похожа на How ListView's recycling mechanism works

Работа с ListView правильно требует довольно объем работы.

Смежные вопросы