Android房间数据库问题

Android房间数据库问题,android,android-room,Android,Android Room,我试图完成这个小的课堂练习,我们必须使用Room数据库保存数据,然后在ListView中显示这些信息 这个应用程序是关于一个玩家的。球员有4个字段(Id、姓名、位置、进球数) 保存的第一个玩家的ID应为#1,第二个玩家的ID应为#2,依此类推 用户必须通过EditText字段输入播放机的名称 然后有三个单选按钮,用户必须选择其中一个以选择其位置(守门员、防守、前锋)。最后,用户必须在最后一个字段中输入该球员通过使用EditText字段取得的进球数 最后,用户必须在最后一个字段中输入该球员通过使

我试图完成这个小的课堂练习,我们必须使用Room数据库保存数据,然后在ListView中显示这些信息

这个应用程序是关于一个玩家的。球员有4个字段(Id、姓名、位置、进球数)

  • 保存的第一个玩家的ID应为#1,第二个玩家的ID应为#2,依此类推

  • 用户必须通过EditText字段输入播放机的名称

  • 然后有三个单选按钮,用户必须选择其中一个以选择其位置(守门员、防守、前锋)。最后,用户必须在最后一个字段中输入该球员通过使用EditText字段取得的进球数

  • 最后,用户必须在最后一个字段中输入该球员通过使用EditText字段取得的进球数

一旦用户点击“保存”按钮,之前选择的所有字段都将被清除,并显示一条快速敬酒信息,显示播放器的ID

为了查看所有保存的数据,用户必须单击“全部查看”按钮,该按钮将带他们进入第二个活动,并显示球员姓名、位置、在下一个活动中得分的数量

我对房间不太熟悉,所以每当我按下“保存”保存按钮时,我的应用程序就会崩溃。任何帮助都将不胜感激,谢谢

MainActivity.Java

public class MainActivity extends AppCompatActivity {

private EditText playerEdt, goalsEdt;
private int id = 0;

private RadioGroup groupRad;
private RadioButton radioButton;

private MyDatabase myDb;

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

    playerEdt = findViewById(R.id.edtPlayer);
    goalsEdt = findViewById(R.id.edtGoals);

    myDb = MyDatabase.getInstance(MainActivity.this);


}

public void saveData(View view) {
    id++;
    String name = playerEdt.getText().toString();

    groupRad = findViewById(R.id.radGroup);

    int selectedId = groupRad.getCheckedRadioButtonId();

    radioButton  = findViewById(selectedId);

    String position = radioButton.getText().toString();

    String goalsString = goalsEdt.getText().toString();

    int goals = Integer.valueOf(goalsString);

    Player player = new Player(id, name, position, goals);

    myDb.playerDao().insert(player);

    playerEdt.setText("");
    goalsEdt.setText("");
    groupRad.clearCheck();



}

public void viewData(View view) {
    Intent intent = new Intent(MainActivity.this, SecondActivity.class);

    startActivity(intent);
}
}
public class SecondActivity extends AppCompatActivity {

ListView listView;
MyDatabase database;

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

    listView = findViewById(R.id.listView);

    database = MyDatabase.getInstance(SecondActivity.this);

    List<Player> players = database.playerDao().getAll();

    ArrayAdapter adapter = new ArrayAdapter(SecondActivity.this, android.R.layout.simple_list_item_1, players);

    listView.setAdapter(adapter);
}
}
Java

public class MainActivity extends AppCompatActivity {

private EditText playerEdt, goalsEdt;
private int id = 0;

private RadioGroup groupRad;
private RadioButton radioButton;

private MyDatabase myDb;

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

    playerEdt = findViewById(R.id.edtPlayer);
    goalsEdt = findViewById(R.id.edtGoals);

    myDb = MyDatabase.getInstance(MainActivity.this);


}

public void saveData(View view) {
    id++;
    String name = playerEdt.getText().toString();

    groupRad = findViewById(R.id.radGroup);

    int selectedId = groupRad.getCheckedRadioButtonId();

    radioButton  = findViewById(selectedId);

    String position = radioButton.getText().toString();

    String goalsString = goalsEdt.getText().toString();

    int goals = Integer.valueOf(goalsString);

    Player player = new Player(id, name, position, goals);

    myDb.playerDao().insert(player);

    playerEdt.setText("");
    goalsEdt.setText("");
    groupRad.clearCheck();



}

public void viewData(View view) {
    Intent intent = new Intent(MainActivity.this, SecondActivity.class);

    startActivity(intent);
}
}
public class SecondActivity extends AppCompatActivity {

ListView listView;
MyDatabase database;

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

    listView = findViewById(R.id.listView);

    database = MyDatabase.getInstance(SecondActivity.this);

    List<Player> players = database.playerDao().getAll();

    ArrayAdapter adapter = new ArrayAdapter(SecondActivity.this, android.R.layout.simple_list_item_1, players);

    listView.setAdapter(adapter);
}
}
PlayerDao.java

@Dao
public abstract class  PlayerDao {
@Insert
public abstract void insert (Player player);

@Delete
public abstract void delete (Player player);

@Update
public abstract void update (Player player);


@Query("select * from Player")
public abstract List<Player> getAll();


}
activity_main.xml:


activity_second.xml:

首先,如果在Player.java类中为
id
使用
autoGenerate=true
会更好:

@Entity
public class Player {
@PrimaryKey(autoGenerate = true)
private int id;  
通过这样做,你不必给你的球员ID和房间为你做的工作


对于保存时发生的应用程序崩溃,您必须检查日志,看看是什么导致应用程序崩溃。更新您的问题,以便用户可以帮助您。

您似乎有许多问题:-

您需要为玩家类的所有成员提供getter

添加了以下内容(和设置器):-

核心问题是,在saveData中查找视图的尝试返回空值,因此您将得到一个空指针异常(NPE),因为“保存”按钮中不存在视图

解决方案是查找视图(即在onCreate方法中使用findviewbyd)

此外,还缺乏数据验证,这将导致问题。以下版本的MainActivity.java处理这些问题:-

public class MainActivity extends AppCompatActivity {

    private EditText playerEdt, goalsEdt;
    private int id = 0;

    private RadioGroup groupRad;
    private RadioButton radioButton;
    private MyDatabase myDb;

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

        playerEdt = findViewById(R.id.edtPlayer);
        goalsEdt = findViewById(R.id.edtGoals);
        groupRad = findViewById(R.id.radGroup);
        myDb = MyDatabase.getInstance(MainActivity.this);
    }

    public void saveData(View view) {
        id++;
        String name = playerEdt.getText().toString();
        if (name.length() < 1) {
            Toast.makeText(view.getContext(),"Player Name is blank. Try again.",Toast.LENGTH_SHORT).show();
            playerEdt.requestFocus();
        }
        radioButton = findViewById(groupRad.getCheckedRadioButtonId());
        if (radioButton == null) {
            Toast.makeText(view.getContext(),"You must select Goalie Defence or Forward. Try again",Toast.LENGTH_SHORT).show();
            return;
        }
        String position = radioButton.getText().toString();

        String goalsString = goalsEdt.getText().toString();
        int goals = 0;
        try {
            goals = Integer.valueOf(goalsString);
        } catch (Exception e) {
            Toast.makeText(view.getContext(),"You must give the number of Goals. try again.",Toast.LENGTH_SHORT).show();
            goalsEdt.requestFocus();
        }

        Player player = new Player(id, name, position, goals);
        if (myDb.playerDao().insert(player) < 1) {
            Toast.makeText(view.getContext(),"Player not Added (duplicate)",Toast.LENGTH_SHORT).show();
            return;
        }
        playerEdt.setText("");
        goalsEdt.setText("");
        groupRad.clearCheck();
        Toast.makeText(view.getContext(),"Player Added. Name is " + name + " Position is " + position + " Goals = " + goals,Toast.LENGTH_SHORT).show();
    }

    public void viewData(View view) {
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        startActivity(intent);
    }
}
public类MainActivity扩展了AppCompatActivity{
私人编辑文本播放机,goalsEdt;
私有int id=0;
私人放射组;
专用单选按钮单选按钮;
私有数据库;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playerEdt=findviewbyd(R.id.edtPlayer);
goalsEdt=findViewById(R.id.edtGoals);
groupRad=findviewbyd(R.id.radGroup);
myDb=MyDatabase.getInstance(MainActivity.this);
}
公共void saveData(视图){
id++;
字符串名称=playerEdt.getText().toString();
if(name.length()<1){
Toast.makeText(view.getContext(),“播放器名称为空。请重试。”,Toast.LENGTH\u SHORT.show();
playerEdt.requestFocus();
}
radioButton=findViewById(groupRad.getCheckedRadioButtonId());
如果(radioButton==null){
Toast.makeText(view.getContext(),“您必须选择守门员防守或前锋。再试一次”,Toast.LENGTH_SHORT.show();
返回;
}
字符串位置=radioButton.getText().toString();
字符串goalsString=goalsEdt.getText().toString();
int目标=0;
试一试{
goals=Integer.valueOf(goalsString);
}捕获(例外e){
Toast.makeText(view.getContext(),“您必须给出目标数,再试一次。”,Toast.LENGTH_SHORT.show();
goalsEdt.requestFocus();
}
玩家=新玩家(id、姓名、位置、目标);
if(myDb.playerDao().insert(player)<1){
Toast.makeText(view.getContext(),“未添加播放器(重复)”,Toast.LENGTH_SHORT.show();
返回;
}
playerEdt.setText(“”);
goalsEdt.setText(“”);
groupRad.clearCheck();
Toast.makeText(view.getContext(),“Player Added.Name为“+Name+”,Position为“+Position+”Goals=“+Goals,Toast.LENGTH_SHORT).show();
}
公共void视图数据(视图){
意向意向=新意向(MainActivity.this,SecondActivity.class);
星触觉(意向);
}
}
此外,PlayerDao.java已被更改为在播放器名称重复时不会失败,并在插入、删除或更新时返回有用的值。它是:-

@Dao
public abstract class  PlayerDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    public abstract long insert (Player player);

    @Delete
    public abstract int delete (Player player);

    @Update
    public abstract int update (Player player);


    @Query("select * from Player")
    public abstract List<Player> getAll();

}
@Dao
公共抽象类PlayerDao{
@插入(onConflict=OnConflictStrategy.IGNORE)
公共摘要长插入(播放器);
@删除
公共摘要int删除(Player);
@更新
公共摘要int更新(Player);
@查询(“从播放器中选择*)
公共摘要列表getAll();
}

处理崩溃最重要的方面是查看日志以查看崩溃的原因。你应该在你的问题中包括这些信息。请参阅,从日志中提取堆栈跟踪,并编辑您的问题以包含该跟踪。
@Dao
public abstract class  PlayerDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    public abstract long insert (Player player);

    @Delete
    public abstract int delete (Player player);

    @Update
    public abstract int update (Player player);


    @Query("select * from Player")
    public abstract List<Player> getAll();

}