当前位置: 首页 > 知识库问答 >
问题:

添加一个1到多关系Android室数据库?

於宾白
2023-03-14

我很难找到在数据库中添加一对多关系的方法。账簿实体需要保存许多计数。当我尝试时,我得到一个错误,上面写着:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.counter, PID: 11949
java.lang.RuntimeException: cannot find implementation for com.example.counter.db.AppDatabase. AppDatabase_Impl does not exist
    at androidx.room.Room.getGeneratedImplementation(Room.java:97)
    at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:1358)
    at com.example.counter.db.AppDatabase.getInstance(AppDatabase.java:18)

以下是我的AppDatabase的外观:

package com.example.counter.db;

import android.content.Context;

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;

@Database(entities = {Count.class, Book.class}, version = 2, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase instance;

    public static AppDatabase getInstance(Context context){
        if(instance != null){
            return instance;
        }else{
            instance = Room.databaseBuilder(context, AppDatabase.class, "AppDatabase_database")
                    .build();
            return instance;
        }
    }

    public abstract CountDAO countDAO();
    public abstract BookDAO bookDAO();
}

计数实体:

package com.example.counter.db;

import androidx.room.Embedded;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import androidx.room.PrimaryKey;

import java.text.SimpleDateFormat;
import java.util.Date;

import static androidx.room.ForeignKey.CASCADE;

@Entity
public class Count {


    @PrimaryKey(autoGenerate = true)
    private long count_id;

    private long book_id;

    private String title;
    private Date date;
    private int total;

    public Count( long book_id, String title, Date date, int total) {
        this.book_id = book_id;
        this.title = title;
        this.date = date;
        this.total = total;
    }


    public long getCount_id() {
        return count_id;
    }

    public void setCount_id(long id) {
        this.count_id = id;
    }

    public long getBook_id() {
        return book_id;
    }

    public void setBook_id(long book_id) {
        this.book_id = book_id;
    }

    public String getCountTitle() {
        return title;
    }

    public void setCountTitle(String title) {
        this.title = title;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    @Override
    public String toString() {
        return "Count{" +
                "id=" + count_id +
                ", book_id=" + book_id +
                ", title='" + title + '\'' +
                ", date=" + date +
                ", total=" + total +
                '}';
    }
}

账簿实体:

package com.example.counter.db;

import androidx.room.Entity;
import androidx.room.PrimaryKey;

import java.util.Date;


@Entity
public class Book {

    @PrimaryKey(autoGenerate = true)
    private long book_id;

    private String title;
    private Date date;


    public Book(String title, Date date) {
        this.title = title;
        this.date = date;
    }

    public long getBook_id() {
        return book_id;
    }

    public void setBook_id(long id) {
        this.book_id = id;
    }

    public String getBookTitle() {
        return title;
    }

    public void setBookTitle(String title) {
        this.title = title;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }


    @Override
    public String toString() {
        return "Book{" +
                "id=" + book_id +
                ", title=" + title +
                ", date=" + date +
                '}';
    }
}

Booked Counts实体

package com.example.counter.db;

import androidx.room.Embedded;
import androidx.room.Relation;

import java.util.List;

public class BookWithCounts {
    @Embedded
    public Book book;
    @Relation(
            parentColumn = "book_id",
            entityColumn = "book_id"
    )

    public List<Count> counts;

    public BookWithCounts(Book book, List<Count> counts){
        this.book = book;
        this.counts = counts;
    }

}

CountDAO

package com.example.counter.db;

import androidx.room.Embedded;
import androidx.room.Relation;

import java.util.List;

public class BookWithCounts {
    @Embedded
    public Book book;
    @Relation(
            parentColumn = "book_id",
            entityColumn = "book_id"
    )

    public List<Count> counts;

    public BookWithCounts(Book book, List<Count> counts){
        this.book = book;
        this.counts = counts;
    }

}

藏书刀


import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Transaction;
import androidx.room.Update;

import java.util.List;

@Dao
public interface BookDAO {

    @Query("select * from Book")
    LiveData<List<Book>> getAllBooks();

    @Query("select * from Book where book_id=:id")
    List<Book> getBookByID(long id);

    @Query("select title from Book")
    LiveData<List<String>> getAllBookTitles();

    @Insert
    long insertBook(Book book);

    @Insert
    long insertCount(Count count);

    @Update
    void updateBook(Book book);

    @Delete
    void deleteBook(Book book);

}


带计数的书

package com.example.counter.db;

import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Transaction;

import java.util.List;

@Dao
public interface BookWithCountsDAO {
    @Transaction
    @Insert
    long insertBook(Book book);

    @Insert
    void insertCounts(List<Count> counts);
}

我还拥有书籍和计数的视图模型,用于填充回收者视图。但是,当我尝试查看recycler视图时会出现错误。

共有1个答案

应涵容
2023-03-14

[更新]我想出了问题。这是事情的结合。首先,我没有注释处理器依赖性。这些是你需要的依赖关系。

    def room_version = "2.3.0"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

我还遇到了使用没有日期转换器的日期类型的问题。我不想弄乱日期转换器。所以我只是简单地将类型更改为字符串。在我能让它工作之后。

 类似资料:
  • 跑步:Laravel 5.3和Laravel背包积垢3.1 我遇到的情况是,我有一个模型,我也想添加多个相关(子)记录,只使用一个CRUD表单。一些示例包括添加多个文件。。。但让我们从小事做起。我发现下面的帖子有相似的主题,但没有明确的答案。 使用字段类型的最佳方法是什么?https://laravel-backpack.readme.io/docs/crud-fields#section-但是,

  • 若要添加一个关系,点击工具栏的 按钮,并拖放子实体到父实体。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 当你移动滑鼠到一个关系连接器时,父和子实体的边界会分别变为绿色和蓝色。 在画布中关系对象的弹出式菜单选项包括: 选项 描述 基数在 实体名1 设置基数在实体名1:无、唯一、多个、一或多个、零或一个、零或多个。 基数在 实体名2 设置基数在实体名2:无、唯一、多个

  • 若要添加一个关系,点击工具栏的 按钮,并由子实体拖拉一个属性到父实体的属性。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 当你移动滑鼠到一个关系连接器时,父和子实体的边界会分别变为绿色和蓝色。此外,父和子实体的参考属性均会高亮显示。 在画布中关系对象的弹出式菜单选项包括: 选项 描述 设计关系 在实体设计器中编辑关系。 基数在 实体名1 设置基数在实体名1:无、唯一

  • 若要添加一个关系,点击工具栏的 按钮,并拖放子实体到父实体。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 当你移动滑鼠到一个关系连接器时,父和子实体的边界会分别变为绿色和蓝色。 在画布中关系对象的弹出菜单选项包括: 选项 描述 基数在 实体名1 设置基数在实体名1:无、唯一、多个、一或多个、零或一个、零或多个。 基数在 实体名2 设置基数在实体名2:无、唯一、多个、

  • 若要添加一个关系,点击工具栏的 按钮,并由子实体拖拉一个属性到父实体的属性。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 当你移动滑鼠到一个关系连接器时,父和子实体的边界会分别变为绿色和蓝色。此外,父和子实体的参考属性均会高亮显示。 在画布中关系对象的弹出式菜单选项包括: 选项 描述 设计关系 在实体设计器中编辑关系。 基数在 实体名1 设置基数在实体名1:无、唯一

  • 若要添加一个关系,点击工具栏的 按钮,并拖放子实体到父实体。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 当你移动滑鼠到一个关系连接器时,父和子实体的边界会分别变为绿色和蓝色。 在画布中关系对象的弹出式菜单选项包括: 选项 描述 基数在 实体名1 设置基数在实体名1:无、唯一、多个、一或多个、零或一个、零或多个。 基数在 实体名2 设置基数在实体名2:无、唯一、多个