【问题标题】:Persisting objects in SugarORMSugarORM 中的持久化对象
【发布时间】:2016-08-16 12:36:51
【问题描述】:

我有一本书课:

public class Book extends SugarRecord {
    private String mBookName;
    private String mAuthorName;
    private List<Page> mPageList;

    public Book() {

    }

    public Book(String bookname, String authorName) {
        mBookName = bookname;
        mAuthorName = authorName;
        mPageList = new ArrayList<>();
    }

    public String getAuthorName() {
        return mAuthorName;
    }

    public void setAuthorName(String authorName) {
        mAuthorName = authorName;
    }

    public String getBookName() {
        return mBookName;
    }

    public void setBookName(String bookName) {
        mBookName = bookName;
    }

    public void addPage(Page page) {
        mPageList.add(page);
    }

}

和 Page 类:

public class Page extends SugarRecord {
    private String mText;

    public Page() {

    }
    public Page(String text) {
        mText = text;
    }

    public String getText() {
        return mText;
    }

    public void setText(String text) {
        mText = text;
    }
}

我正在用这个测试它:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Book book = new Book("Some Book Title", "John Doe");

        Page page1 = new Page("Once upon a time there was a very lonely bunny who wanted some friends.");
        Page page2 = new Page("So he found some friends, and everyone was happy.");
        Page page3 = new Page("The end!");

        book.addPage(page1);
        book.addPage(page2);
        book.addPage(page3);

        book.save();
    }
}

但是它没有按预期工作。它正在尝试使用此 .schema 使 mPageList 成为自己的列:

CREATE TABLE BOOK ( ID INTEGER PRIMARY KEY AUTOINCREMENT , M_AUTHOR_NAME TEXT, M_BOOK_NAME TEXT, M_PAGE_LIST  );

我真正想做的不是将列表视为自己的列,而是将页面保存到 PAGE 表中,并带有引用此 Book 类的其他 id(所以我期待的是类似于 @987654326 @)。简而言之,就是通过嵌套子对象级联的持久化操作。

这可以在 SugarORM 中完成吗?

【问题讨论】:

    标签: java android sqlite persistence sugarorm


    【解决方案1】:

    没有 ORM 数据库(SugarORm、DBFLow 等)支持列表列。如您所知,sql 也没有这种数据类型。

    这就是您收到此错误的原因。如果您问我如何将列表保存到 ORM。我用格森。

    将 Pagelist 声明为字符串。

    字符串页面列表;

    在将其保存到数据库之前,请借助 Gson 库将其转换为 Json 字符串。

    Gson gson = new Gson();
    String value = gson.toJson(your_page_list);
    

    从数据库中检索时,使用 Gson 将 json 字符串转换为 List。

    List<Page> page_list;
      Type typeIndicatorForGson = new TypeToken<ArrayList<Page>>() {}.getType(); 
     Gson myGson = new Gson();  
     page_list = myGson.fromJson(page_json_data_from_database, typeIndicatorForGson); 
    

    【讨论】:

      【解决方案2】:

      SugarORM 上没有 List&lt;Object&gt;。你可以管理这个的方式有点棘手。简而言之,您可以管理颠倒的 1 对 N 关系。看下一个例子 让我们假设一个 Team 对象可以有 N 个 Person 对象。通常你会以这种方式在你的班级Team 中使用List&lt;Person&gt;

      public class Team {
         String teamName;
         List<Person>
         ...
      }
      
      public class Person {
         String name;
         String rol;
         ...
      }
      

      嗯,在 SugarORM 上是不可能的。但是您可以将Team 作为属性添加到Person 中,因此,任何Person 的实例都应该包含对它所属的Team 对象的引用。

      public class Team extends SugarRecord<Team> {
         String teamName;
         ...
      }
      
      public class Person extends SugarRecord<Person> {
         String name;
         String rol;
         Team team;
         ...
      }
      

      然后您可以使用以下方法(在 Team 类中)从 Team 获取所有 Person 对象:

      public class Team extends SugarRecord<Team> {
         String teamName;
         ...
      
          public List<Person> getPersons(){
                  return Person.find(Person.class, "id = ?", String.valueOf(this.getId()));
          }
      }
      

      因此,您可以管理 1 对 N 关系,但不能管理 N 对 M 关系(属于多个 Team 对象的人员)。 IMO 管理此问题的方法是使用关联实体将 N 到 M 拆分为两个 1 到 N 关系。 如您所见,SugarORM 不允许您仅根据对象进行思考,但是,无论如何您都可以节省大量样板代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-21
        • 2017-10-10
        • 2016-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        相关资源
        最近更新 更多