在 Android Studio 中尝试将字符串、整数和微调器值保存到房间持久性数据库时出错

Errors when trying to save strings, ints and spinner values to room persistence database in Android Studio

我正在尝试在我的计步程序中创建一个数据库,该数据库能够在 Android Studio 中保存用户的详细信息:姓名、年龄、性别、平均步幅、体重和身高。但是,我不断遇到无法定位或解决的错误。如果这是菜鸟的错误,我们深表歉意;我对 Android Studio 或 Room Persistence Library 没有太多经验。这是有问题的代码:

UserDetails.java:

@Entity(tableName = "user details")
public class UserDetails extends AppCompatActivity {

@NonNull
//each value for the primary key will be assigned a unique,
// automatically generated UserID
@PrimaryKey (autoGenerate = true)
@ColumnInfo(name = "ID")
public int UserID;

@ColumnInfo(name = "Name")
public String UserName;

@ColumnInfo(name = "Age")
public int UserAge;

@ColumnInfo(name = "Gender")
public String UserGender;

@ColumnInfo(name = "Average Stride Length")
public int UserAveStride;

@ColumnInfo(name = "Weight")
public int UserWeight;

@ColumnInfo(name = "Height")
public int UserHeight;

public UserDetails() {
}

@Ignore
public UserDetails(String userName, int userAge, String userGender, int 
userAveStride, int userWeight, int userHeight) {
    UserName = userName;
    UserAge = userAge;
    UserGender = userGender;
    UserAveStride = userAveStride;
    UserWeight = userWeight;
    UserHeight = userHeight;
}

public int getUserID() {
    return UserID;
}

public void setUserID(int userID) {
    UserID = userID;
}

public String getUserName() {
    return UserName;
}

public void setUserName(String userName) {
    UserName = userName;
}

public int getUserAge() {
    return UserAge;
}

public void setUserAge(int userAge) {
    UserAge = userAge;
}

public String getUserGender() {
    return UserGender;
}

public void setUserGender(String userGender) {
    UserGender = userGender;
}

public int getUserAveStride() {
    return UserAveStride;
}

public void setUserAveStride(int userAveStride) {
    UserAveStride = userAveStride;
}

public int getUserWeight() {
    return UserWeight;
}

public void setUserWeight(int userWeight) {
    UserWeight = userWeight;
}

public int getUserHeight() {
    return UserHeight;
}

public void setUserHeight(int userHeight) {
    UserHeight = userHeight;
}

@Override
public String toString(){
    return new 
StringBuilder(UserName).append("\n").append(UserAge).append("\n")

.append(UserGender).append("\n").append(UserAveStride).append("\n")
            .append(UserWeight).append("\n").append(UserHeight).toString();
}

DbContent.java

    public class DbContent extends AppCompatActivity {

private ListView lstUser;
private FloatingActionButton fab;

//array adapter
List<UserDetails> userList;
ArrayAdapter adapter;

//database
private CompositeDisposable compositeDisposable;
private UserRepository userRepository;

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

    //init
    compositeDisposable = new CompositeDisposable();

    //init view
    lstUser =  findViewById(R.id.lstUsers);
    fab =  findViewById(R.id.fab);
    adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, 
userList);
    registerForContextMenu(lstUser);
    lstUser.setAdapter(adapter);

    //creating database
    Database database = Database.getmInstance(this);
    userRepository = 

UserRepository.getmInstance(UserDataSource.getmInstance(database.userDao()));

    //load all data from database
    loadData();

    //getting values from user inputs
   final EditText name = findViewById(R.id.nameInput);
   final EditText age =  findViewById(R.id.ageInput);
   final Spinner gender =  findViewById(R.id.genderDropDown);
   final EditText aveStride =  findViewById(R.id.strideInput);
   final EditText weight =  findViewById(R.id.weightInput);
   final EditText height =  findViewById(R.id.heightInput);

   //converting to strings
   final String nameStr = name.getText().toString();
   final String ageStr = age.getText().toString();
   final String genderStr = gender.getSelectedItem().toString();
   final String aveStrideStr = aveStride.getText().toString();
   final String weightStr = weight.getText().toString();
   final String heightStr = height.getText().toString();

   //converting string to int where needed
    final int ageInt = Integer.parseInt(ageStr);
    final int aveStrideInt = Integer.parseInt(aveStrideStr);
    final int weightInt = Integer.parseInt(weightStr);
    final int heightInt = Integer.parseInt(heightStr);

    //Event
    fab.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            //Add new
            Disposable disposable = (Disposable) io.reactivex
                    .Observable.create(new ObservableOnSubscribe<Object>() {
                @Override
                public void subscribe(ObservableEmitter<Object> e) throws 
Exception {
                    UserDetails userDetails = new UserDetails(nameStr, 
ageInt,
                            genderStr, aveStrideInt, weightInt, heightInt);

                    userRepository.insertUser(userDetails);
                    e.onComplete();
                    }
            })
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.io())
                    .subscribe(new Consumer() {
                                   @Override
                                   public void accept(Object o) throws Exception {
                                       Toast.makeText(DbContent.this,
                                               "Data added", Toast.LENGTH_SHORT).show();
                                   }
                               }, new Consumer<Throwable>() {
                                   @Override
                                   public void accept(Throwable throwable) throws Exception {
                                       Toast.makeText(DbContent.this,
                                               "" + throwable.getMessage(), Toast.LENGTH_SHORT).show();
                                   }
                                   //Refreshing data
                               }, new Action() {
                                   @Override
                                   public void run() throws Exception {
                                       loadData();
                                   }
                               }

                    );
        }
    });
}

private void loadData() {
    //Using RXJava
    Disposable disposable = userRepository.getAllDetails()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(new Consumer<List<UserDetails>>() {
                @Override
                public void accept(List<UserDetails> userDetails) throws Exception {
                    OnGetAllDetailsSuccess(userDetails);

                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    Toast.makeText(DbContent.this, ""+throwable.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
    compositeDisposable.add(disposable);
}

private void OnGetAllDetailsSuccess(List<UserDetails> userDetails) {
    userList.clear();
    userList.addAll(userDetails);
    adapter.notifyDataSetChanged();


}
}

Database.java

    @android.arch.persistence.room.Database(entities = {UserDetails.class}, 
version = DATABASE_VERSION)
public abstract class Database extends RoomDatabase {
public static final int DATABASE_VERSION=1;
public static final String DATABASE_NAME ="Database-Room";
public abstract UserDao userDao();

private static Database mInstance;

public static Database getmInstance(Context context)
{
    if (mInstance == null){
        mInstance = Room.databaseBuilder(context,Database.class,DATABASE_NAME)
                .fallbackToDestructiveMigration()
                .build();
    }
    return mInstance;
}
}

UserDataSource.java

public class UserDataSource implements IUserDataSource {

private UserDao userDao;
private static UserDataSource mInstance;

public UserDataSource(UserDao userDao) {
    this.userDao = userDao;
}

public static UserDataSource getmInstance(UserDao userDao) {
    if(mInstance == null){
        mInstance = new UserDataSource(userDao);
    }
    return mInstance;
}

@Override
public Flowable<UserDetails> getUserById(int userId) {
    return userDao.getUserById(userId);
}

@Override
public Flowable<List<UserDetails>> getAllDetails() {
    return userDao.getAllDetails();
}

@Override
public void insertUser(UserDetails... userDetails) {
    userDao.insertUser(userDetails);
}

@Override
public void updateUser(UserDetails... userDetails) {
    userDao.updateUser(userDetails);
}

@Override
public void deleteUser(UserDetails userDetails) {
    userDao.deleteUser(userDetails);
}
}

UserRepository.java

public class UserRepository implements IUserDataSource {

private IUserDataSource mLocalDataSource;
private static UserRepository mInstance;

public UserRepository(IUserDataSource mLocalDataSource) {
    this.mLocalDataSource = mLocalDataSource;
}

public static UserRepository getmInstance(IUserDataSource mLocalDataSource) {
    if(mInstance == null){
        mInstance = new UserRepository(mLocalDataSource);
    }
    return mInstance;
}

@Override
public Flowable<UserDetails> getUserById(int userId) {
    return mLocalDataSource.getUserById(userId);
}

@Override
public Flowable<List<UserDetails>> getAllDetails() {
    return mLocalDataSource.getAllDetails();
}

@Override
public void insertUser(UserDetails... userDetails) {
    mLocalDataSource.insertUser(userDetails);
}

@Override
public void updateUser(UserDetails... userDetails) {
    mLocalDataSource.updateUser(userDetails);
}

@Override
public void deleteUser(UserDetails userDetails) {
    mLocalDataSource.deleteUser(userDetails);

}
}

UserDao.java

@Dao
public interface UserDao {
@Query("SELECT * FROM `user details` WHERE id=:userId")
Flowable<UserDetails> getUserById(int userId);

@Query("SELECT * FROM `user details`")
Flowable<List<UserDetails>> getAllDetails();

@Insert
void insertUser(UserDetails... userDetails);

@Update
void updateUser(UserDetails... userDetails);

@Delete
void deleteUser(UserDetails userDetails);
}

我UserDataSource.java

public interface IUserDataSource {
Flowable<UserDetails> getUserById(int userId);
Flowable<List<UserDetails>> getAllDetails();
void insertUser(UserDetails... userDetails);
void updateUser(UserDetails... userDetails);
void deleteUser(UserDetails userDetails);
}

错误是:

不知道如何将这个字段保存到数据库中。可以考虑为其添加类型转换器
找不到字段 getter。
找不到字段的 setter。
无法弄清楚如何从游标读取此字段。 找不到字段 getter。
找不到字段的 setter。

我非常感谢任何帮助,因为我花了很多时间试图解决这个问题,这个项目是我成绩的五分之一;它很快就会到期,我需要花时间完成其他功能并对其进行测试,而不是花费数小时来修复错误。谢谢。

我认为您要描述的错误类似于:-

原因是您通过编码 [=14 使 UserDetails 成为 AppCompatActivity class 的子 class =]

而不是:-

@Entity(tableName = "user details")
public class UserDetails extends AppCompatActivity { ..........

你应该有:-

@Entity(tableName = "user details")
public class UserDetails { ........
  • 注意点代表代码的其余部分,它们不是为了编码,而是为了简洁。