【发布时间】:2021-10-01 07:44:05
【问题描述】:
由于某种原因even after following some parts of the guide,我无法在我的数据库中插入新条目。检索是可以的。我真的不想做指南中提到的呼吸和视图模型样板
我已经将相关的依赖项放在了 build.gradle 中。 我正在使用 Java 11。
TemiPatrolRoomDatabase.java:
@Database(entities = {AudioFile.class},version = 1)
public abstract class TemiPatrolRoomDatabase extends RoomDatabase {
public abstract TemiPatrolDAO temiPatrolDAO();
private static volatile TemiPatrolRoomDatabase INSTANCE;
private static final int NUMBER_OF_THREADS = 8;
public static final ExecutorService databaseWriteExecutor =
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
public static TemiPatrolRoomDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (TemiPatrolRoomDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
TemiPatrolRoomDatabase.class, "temiPatrolDatabase")
.build();
}
}
}
return INSTANCE;
}
}
TemiPatrolDAO.java
@Dao
public interface TemiPatrolDAO {
@Query("SELECT * from AudioFile")
List<AudioFile> getAll();
@Insert(entity = AudioFile.class,onConflict = OnConflictStrategy.IGNORE)
void insertAll(AudioFile... audioFiles);
@Insert(entity = AudioFile.class,onConflict = OnConflictStrategy.IGNORE)
void insert(AudioFile audioFile);
@Delete
void delete(AudioFile audioFile);
}
SettingsFragment.java:
public void onCreate(Bundle savedInstanceState) {
....
addAudioFileResultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
Intent resultingIntent = result.getData();
assert resultingIntent != null;
var uri = resultingIntent.getData();
var cursor = requireActivity()
.getContentResolver()
.query(uri, null, null,
null, null);
int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
cursor.moveToFirst();
var fileName = cursor.getString(nameIndex);
Toast.makeText(getActivity(),
"audio added:" + fileName,
Toast.LENGTH_LONG)
.show();
var audioFile = new AudioFile(uri.getPath(), fileName);
var future = TemiPatrolRoomDatabase.databaseWriteExecutor.submit(() -> {
Log.d(TAG, "audio name to be inserted:"+audioFile.getName());
temiPatrolDAO.insert(audioFile);
var a = (ArrayList<AudioFile>) temiPatrolDAO.getAll();
Log.d(TAG, "after insertion");
for (var a1 : a) {
Log.d(TAG, "file name:" + a1.getName());
}
});
while (!future.isDone()){}
Log.d(TAG, "after future of inserting data is done");
audioFiles.add(audioFile);
customAdapter.notifyDataSetChanged();
cursor.close();
}
);
var context = requireActivity().getApplicationContext();
var database = TemiPatrolRoomDatabase.getDatabase(context);
temiPatrolDAO = database.temiPatrolDAO();
}
AudioFile.java
@SuppressWarnings("ALL")
@Entity
public class AudioFile {
@PrimaryKey
private int audioFileID;
private String uriPath;
private String name;
public AudioFile(String uriPath, String name) {
this.setUriPath(uriPath);
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAudioFileID() {
return audioFileID;
}
public void setAudioFileID(int audioFileID) {
this.audioFileID = audioFileID;
}
public String getUriPath() {
return uriPath;
}
public void setUriPath(String uriPath) {
this.uriPath = uriPath;
}
}
【问题讨论】:
-
如果将
insert函数的@Insert(entity = AudioFile.class,onConflict = OnConflictStrategy.IGNORE)更改为@Insert(entity = AudioFile.class),会得到什么结果?然后它会发出异常吗?也可以将 AudioFile 类添加到您的问题中。 -
添加了 AudioFIle.java。删除
onConflict = OnConflictStrategy.IGNORE后没有错误消息。编辑:也许我误解了 Room 自动添加 id,让我更改主键... -
感谢您的帮助,将主键从 id 更改为我的 uriPath 有效。
标签: java android android-room