[英]Errors when trying to save strings, ints and spinner values to room persistence database in Android Studio
I'm trying to create a database within my step counting program that is able to save a user's details: Name, Age, Gender, Average Stride Length, Weight and Height in Android Studio. 我正在尝试在自己的计步程序中创建一个数据库,该数据库能够保存用户的详细信息:Android Studio中的姓名,年龄,性别,平均步幅,体重和身高。 However I keep encountering errors that I am unable to locate or solve. 但是,我一直遇到无法找到或解决的错误。 Apologies if it is a rookie mistake; 抱歉,这是菜鸟的错误; I am not in possession of a great deal of experience for Android Studio or the Room Persistence Library. 我没有大量的Android Studio或Room Persistence Library经验。 Here is the code in question: 这是有问题的代码:
UserDetails.java: 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 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 数据库.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 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 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 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);
}
IUserDataSource.java IUserDataSource.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);
}
The errors are: 错误是:
Cannot figure out how to save this field into database. 无法弄清楚如何将该字段保存到数据库中。 You can consider adding a type converter for it. 您可以考虑为其添加类型转换器。
Cannot find getter for field. 找不到字段的获取器。
Cannot find setter for field. 找不到字段的设置器。
Cannot figure out how to read this field from a cursor. 无法弄清楚如何从光标读取此字段。 Cannot find getter for field. 找不到字段的获取器。
Cannot find setter for field. 找不到字段的设置器。
I appreciate any help greatly as I have spent a number of hours trying to fix this and this project is one fifth of my grade; 我非常感谢您的帮助,因为我花了很多时间来解决这个问题,而这个项目是我成绩的五分之一; it is due in soon and I need to spend time finishing other features and testing it rather than spending hours trying to fix errors. 很快就要到期了,我需要花时间完成其他功能并对其进行测试,而不是花时间尝试修复错误。 Thank you. 谢谢。
I believe that the errors you are trying to describe are similar to :- 我相信您要描述的错误类似于:-
The cause of these would be that you have made your UserDetails
a subclass of the AppCompatActivity
class by encoding extends AppCompatActivity
这些的原因是通过编码extends AppCompatActivity
使UserDetails
成为AppCompatActivity
类的子类。
Instead of :- 代替 :-
@Entity(tableName = "user details")
public class UserDetails extends AppCompatActivity { ..........
You should have :- 你应该有 :-
@Entity(tableName = "user details")
public class UserDetails { ........
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.