如何在 ROOM android 中修复“不确定如何将光标转换为此方法的返回类型”
Posted
技术标签:
【中文标题】如何在 ROOM android 中修复“不确定如何将光标转换为此方法的返回类型”【英文标题】:How to fix 'Not sure how to convert a Cursor to this method's return type' In ROOM android 【发布时间】:2019-12-03 10:48:48 【问题描述】:我正在使用房间来构建简单的笔记应用程序。 这是我的笔记实体类:
@Entity(tableName = "notes")
public class Note
@PrimaryKey(autoGenerate = true)
private long id;
@ColumnInfo(name = "description")
private String description;
@Ignore
public Note()
public Note(String description)
this.description = description;
public long getId()
return id;
public void setId(long id)
this.id = id;
public String getDescription()
return description;
public void setDescription(String description)
this.description = description;
这是我的 DAO:
@Dao
public interface NoteDAO
@Insert
public long[] insertNote(Note... note);
@Update
public void updateNote(Note note);
@Delete
public void deleteNote(Note note);
@Query("Select * from notes")
LiveData<List<Note>> getAllNotes();
这是我的存储库:
public class NoteRepository
NoteDatabase mNoteDatabase;
public NoteRepository(Context context)
this.mNoteDatabase = NoteDatabase.getInstance(context);
public void insertNote(Note note)
// mNoteDatabase.getNodeDAO().insertNote(note);
new InsertAsync(mNoteDatabase.getNodeDAO()).execute(note);
public void updateNote(Note note)
mNoteDatabase.getNodeDAO().updateNote(note);
public void deleteNote(Note note)
mNoteDatabase.getNodeDAO().deleteNote(note);
public LiveData<List<Note>> getAllNotes()
return mNoteDatabase.getNodeDAO().getAllNotes();
这是我阅读所有笔记的方法。
private void retrieveNote()
mNoteRepository.getAllNotes().observe(this, new Observer<List<Note>>()
@Override
public void onChanged(@Nullable List<Note> notes)
if(data.size()>0)
data.clear();
if(data!=null)
data.addAll(notes);
adapter.notifyDataSetChanged();
);
数据的返回类型为ArrayList。 我读到了 DAO 仅使用列表和 Livedata 的问题,我使用的是相同的,但我无法找出问题所在。
我希望它应该返回一个笔记列表。但是我的应用程序崩溃并且此错误消息显示“不确定如何将光标转换为此方法的返回类型”。
【问题讨论】:
请张贴您的笔记对象 @a_local_nobody 已更新。请检查 别担心,我会告诉你我能找到什么 真的不知道为什么会崩溃,你到处都在使用LiveData<List<Note>>
,对吧?
【参考方案1】:
我通过更新到 androidx 解决了这个问题。 你可以在这里找到链接: https://developer.android.com/jetpack/androidx/migrate
如果您使用的是 android studio 3.2,只需转到 REFACTOR -> MIGRATE TO ANDROIDx。
【讨论】:
【参考方案2】:您的代码对我有用。请在我的代码下方查看
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:id="@+id/txt"
android:layout_
android:layout_ />
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity
private TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = findViewById(R.id.txt);
Note note1 = new Note();
note1.setDescription("Hello");
Note note2 = new Note();
note1.setDescription("Hello 2");
Note note3 = new Note();
note1.setDescription("Hello 3");
NoteRepository repository = new NoteRepository(this);
repository.insertNote(note1);
repository.insertNote(note2);
repository.insertNote(note3);
repository.getAllNotes().observe(this, new Observer<List<Note>>()
@Override
public void onChanged(@Nullable List<Note> notes)
for (int i = 0; i < notes.size(); i++)
String data = txt.getText() + notes.get(i).getDescription();
txt.setText("," + data);
);
build.gradle(app)
apply plugin: 'com.android.application'
android
compileSdkVersion 28
defaultConfig
applicationId "com.hardik.demo_java"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
buildTypes
release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
dependencies
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:design:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'android.arch.persistence.room:runtime:1.1.1'
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
NoteRepository.java
public class NoteRepository
NoteDatabase mNoteDatabase;
public NoteRepository(Context context)
this.mNoteDatabase = NoteDatabase.getInstance(context);
public void insertNote(Note note)
mNoteDatabase.getNodeDAO().insertNote(note);
public void updateNote(Note note)
mNoteDatabase.getNodeDAO().updateNote(note);
public void deleteNote(Note note)
mNoteDatabase.getNodeDAO().deleteNote(note);
public LiveData<List<Note>> getAllNotes()
return mNoteDatabase.getNodeDAO().getAllNotes();
NoteDatabase.java
@Database(entities = Note.class, version = 1)
public abstract class NoteDatabase extends RoomDatabase
private static NoteDatabase INSTANCE;
public abstract NoteDAO getNodeDAO();
public static NoteDatabase getInstance(Context context)
if (INSTANCE == null)
INSTANCE =
Room.databaseBuilder(context.getApplicationContext(), NoteDatabase.class, "user-database")
// allow queries on the main thread.
// Don't do this on a real app! See PersistenceBasicSample for an example.
.allowMainThreadQueries()
.build();
return INSTANCE;
public static void destroyInstance()
INSTANCE = null;
NoteDAO.java
@Dao
public interface NoteDAO
@Insert
public long[] insertNote(Note... note);
@Update
public void updateNote(Note note);
@Delete
public void deleteNote(Note note);
@Query("Select * from notes")
LiveData<List<Note>> getAllNotes();
Note.java
@Entity(tableName = "notes")
public class Note
@PrimaryKey(autoGenerate = true)
private long id;
@ColumnInfo(name = "description")
private String description;
@Ignore
public Note()
public Note(String description)
this.description = description;
public long getId()
return id;
public void setId(long id)
this.id = id;
public String getDescription()
return description;
public void setDescription(String description)
this.description = description;
试试我的代码并告诉我更多帮助
【讨论】:
我也看不出有什么问题,也许 OP 需要清理和构建以重新创建房间类? 不,我只是说我没有看到 OP 的代码有任何问题,也许这只是 Room 的问题 你用的是和我一样的版本吗? @HardikBambhania that allowmainthreadqueries() ,我想我不应该使用它。我正在使用异步任务。这会导致错误吗? @FazalJarral : 试着告诉我以上是关于如何在 ROOM android 中修复“不确定如何将光标转换为此方法的返回类型”的主要内容,如果未能解决你的问题,请参考以下文章
Room 无法验证数据完整性。如何在不编写迁移步骤的情况下修复它?
kotlin 升级到 1.6.0 后如何在 Room Dao 中使用挂起修饰符?
如何在android中使用Room Library fts4查询整个表