【发布时间】:2019-10-05 22:03:27
【问题描述】:
我正在编写小型应用程序,我为此使用了空间。 SQLite 包装器。 就我的代码工作而言,有些功能它们不起作用。此外,文档似乎非常不完整,或者在某些方面是错误的。比如dao注解@Update和@Delete。 我慢慢地对使用这个框架感到困惑,我想回到使用 SQLite API 来代替它。你觉得房间怎么样?
现在是我想问的主要问题。我将向您展示我的代码,也许您会看到,为什么不能正常工作。
首先,我的实体和道。它应该代表一个音频文件。
@Entity(tableName = "audiofile")
public class AudioFile
{
@PrimaryKey(autoGenerate = true)
private long id;
@ColumnInfo(name = "title")
private String title;
@ColumnInfo(name = "artist")
private String artist;
@ColumnInfo(name = "path")
private String path;
@ColumnInfo(name = "duration")
private long duration;
@Dao
public interface AudioFileDao
{
@Query("SELECT * FROM audiofile WHERE title LIKE :title")
AudioFile getAudioFile(String title);
@Query("SELECT * FROM audiofile")
List<AudioFile> getAll();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void initAudioFiles(AudioFile... audioFiles);
@Update
void updateAudioFile(AudioFile... audioFiles);
// @Query("DELETE FROM audiofile WHERE id = :audioFileId")
@Delete
void deleteAudioFile(AudioFile audioFile);
@Insert
void insertAll(AudioFile... audioFiles);
@Insert
long insertAudioFile(AudioFile audioFile);
}
那是常规的数据库管理器。
@Database(entities = {AudioFile.class}, version = 1)
public abstract class DbManager extends RoomDatabase
{
private static DbManager INSTANCE;
public abstract AudioFile.AudioFileDao audioFileDao();
public static DbManager getDbManager(Context ctx){
if (INSTANCE == null){
INSTANCE = Room.databaseBuilder(ctx.getApplicationContext(), DbManager.class, "playlist").build();
}
return INSTANCE;
}
public static void destroyInstance(){
INSTANCE = null;
}
}
Aaaand 这是我的测试,它产生了我所有的担忧:
@RunWith(JUnit4.class)
public class DbManagerAndroidTest
{
private AudioFile.AudioFileDao audioFileDao;
private DbManager db;
@Before
public void createDb()
{
Context ctx = InstrumentationRegistry.getInstrumentation().getContext();
db = Room.inMemoryDatabaseBuilder(ctx, DbManager.class).build();
audioFileDao = db.audioFileDao();
}
/**
* Test CRUD
*/
@Test
public void writeAndRead()
{
AudioFile audioFile = new AudioFile.Builder("title")
.withArtist("artist")
.withDuration(5)
.withPath("/this/is/path")
.build();
audioFileDao.insertAudioFile(audioFile);
assertTrue(db.audioFileDao().getAll().size() > 0);
assertEquals("title", db.audioFileDao().getAll().get(0).getTitle());
audioFile.setArtist("yo-mama");
//It won´t update
audioFileDao.updateAudioFile(audioFile);
assertEquals("yo-mama", audioFileDao.getAudioFile("title").getArtist());
//It won´t delete
audioFileDao.deleteAudioFile(audioFile);
assertEquals(0, audioFileDao.getAll().size());
}
@After
public void tearDown(){
db.clearAllTables();
db.close();
}
}
提前感谢您的帮助。这件事让我很生气。
【问题讨论】:
标签: java sqlite android-sqlite android-room