简体   繁体   English

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

[英]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 { ........
  • Note the dots represent the rest of the code, they are not intended to be coded, they are for the sake of brevity. 注意,点代表代码的其余部分,它们并不是为了进行编码,而是为了简洁起见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 尝试读取整数和字符串文件并获取错误 - Trying Reading a file of ints and strings and getting errors 尝试在Android Studio上使用Room - Trying to use Room on Android Studio 在Room Persistence Library Android Studio中插入后获取RowID - Getting RowID after inserting in Room Persistence Library Android Studio 从 MySQL 数据库检索数据时出现 Android Studio Spinner 问题 - Android Studio Spinner issue when retrieving data from MySQL database 用房间数据库填充微调器 - Fill Spinner with Room Database 我正在尝试在 Android Studio 中创建一个 Spinner - I'm trying to create a Spinner in Android Studio 为什么在类型转换器的帮助下尝试在 Room 数据库中保存列表时出现错误? - Why am I getting an error when trying to save a list in Room database with the help of a type converter? 当项目在strings.xml中列出而不是在Android Studio中作为静态时,如何删除在Spinner中选择的项目按钮? - How to delete the item selected in a Spinner on button click when the items are listed in strings.xml and not as static in Android Studio? 尝试在Android Studio中安装按钮时出现编译器错误 - Compiler Errors when trying to install a button in android studio 当所有字段以及 RadioButton 和 Spinner 之一在 Android Studio 中被检查和归档时,如何启用按钮保存? - How to enable button save when all fields and one of the RadioButton and Spinner are checks and fileds in Android Studio?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM