GreenDao3.2.2保存List<String>类型数据

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:12   2328   0

Android框架之GreenDao3.2.2的使用中,介绍了如何简单使用GreenDao,并创建了User类来保存一些简单的数据。

但是假如在User中有一种List类型的数据也需要保存到数据库中,该如何处理呢?

答案很简单,可以转换一下思路,遍历List数据,然后将所有的String对象都append到一个StringBuilder中,然后保存在数据库中即可。
事实上,GreenDao已经为我们考虑到了这种情况,因此才有了 PropertyConverter 这个接口

在PropertyConverter接口中,有两个需要实现的抽象方法

//将数据库中的值,转化为实体Bean类对象(比如List<String>)
P convertToEntityProperty(D databaseValue);

//将实体Bean类(比如List<String>)转化为数据库中的值(比如String)
D convertToDatabaseValue(P entityProperty);

具体实现如下所示:

public class StringConverter implements PropertyConverter<List<String>, String>{

    @Override
    public List<String> convertToEntityProperty(String databaseValue) {
        if (databaseValue == null) {
            return null;
        }
        else {
            List<String> list = Arrays.asList(databaseValue.split(","));
            return list;
        }
    }

    @Override
    public String convertToDatabaseValue(List<String> entityProperty) {
        if(entityProperty==null){
            return null;
        }
        else{
            StringBuilder sb= new StringBuilder();
            for(String link:entityProperty){
                sb.append(link);
                sb.append(",");
            }
            return sb.toString();
        }
    }
}

具体使用

首先创建User对象,如下所示:

@Entity   //  用于标识这是一个需要Greendao帮我们生成代码的bean
public class User {

    @Id(autoincrement = true)
    private Long id;

    @Property(nameInDb = "user_name")
    @NotNull
    private String name;

    @Convert(columnType = String.class, converter = StringConverter.class)
    private List<String> nickNames;
}

以上代码的nickNames是一个List< String > 类型,因此需要使用Converter进行转化,具体指定Converter的方法就是添加@Converter注解。 User写好之后,可以编译一下工程,然后studio会为我们自动创建UserDao类

然后看一下布局文件:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <EditText
            android:id="@+id/editUserName"
            android:hint="please input user name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <EditText
            android:id="@+id/editUserNickName1"
            android:hint="please input user name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <EditText
            android:id="@+id/editUserNickName2"
            android:hint="please input user name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <Button
            android:text="创建数据库"
            android:onClick="createDatabase"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <Button
            android:text="插入数据"
            android:onClick="insert"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</ScrollView>

最后看一下MainActivity.java中的关键代码:

public class MainActivity extends AppCompatActivity {
    private EditText editName;
    private EditText editNickName1;
    private EditText editNickName2;

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

        editName = ((EditText) findViewById(R.id.editUserName));
        editNickName1 = ((EditText) findViewById(R.id.editUserNickName1));
        editNickName2 = ((EditText) findViewById(R.id.editUserNickName2));
    }
}

/**
* 点击创建数据库Button时,调用此方法创建数据库
*/
    public void createDatabase(View view) {
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "user.db");

        daoMaster = new DaoMaster(helper.getWritableDb());

        daoSession = daoMaster.newSession();

        userDao = daoSession.getUserDao();

        orderDao = daoSession.getMyOrderDao();
    }

/**
* 点击插入数据Button时,调用此方法插入一条User数据
*/
    public void insert(View view) {
        User user = new User();

        user.setName(editName.getText().toString());

        List<String> nickNames = new ArrayList<>();
        String nickName1 = editNickName1.getText().toString();
        String nickName2 = editNickName2.getText().toString();
        nickNames.add(nickName1);
        nickNames.add(nickName2);

        user.setNickNames(nickNames);

        long insertID = userDao.insert(user);

        if (insertID >= 0) {
            Toast.makeText(this, "插入 User 成功", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "插入User 失败", Toast.LENGTH_SHORT).show();
        }

    }

具体使用方式,可以参考GreenDaoDemos : GreenDaoDemos

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP