如何在 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&lt;List&lt;Note&gt;&gt;,对吧? 【参考方案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查询整个表

Android Room:使用 Room 插入关系实体

Android:如何使 Kotlin 中所有对象列表的类型转换器(用于 Room)通用

如何在首次运行时填充 Android Room 数据库表?