Android学习——SQLite游戏玩家管理案例

SQLite游戏玩家管理案例

功能设计

根据我们要展示的数据,设计一个排行榜后台管理功能包括:
1、显示游戏玩家列表,按分数降序
2、管理员可手动修改每个玩家的数据
3、管理员可单击后单独查看一个玩家的数据
4、管理员可删除-一个玩家的数据(实际应用中不会存在真正删除功能,刪除也是修改数据状态而已)

功能实现

定义元数据库类:GAMEMetaData和表结构数据内部类GamePlayer
元数据库

package com.example.playermanager.db;

import android.provider.BaseColumns;
//数据库元数据
public final class GameMetaData {
    private GameMetaData(){}
    public static abstract class GamePlayer implements BaseColumns{
        public static final String TABLE_NAME="gameplayer";
        public static final String PLAYER="player";
        public static final String SCORE="score";
        public static final String LEVEL="level";
    }
}

表结构数据内部类

package com.example.playermanager.entity;

//玩家实体类
public class GamePlayer {
    private int id;
    private String player;
    private int score;
    private int level;

    public GamePlayer(int id, String player, int score, int level) {
        this.id = id;
        this.player = player;
        this.score = score;
        this.level = level;
    }
    public GamePlayer( String player, int score, int level) {
        this.player = player;
        this.score = score;
        this.level = level;
    }
    public GamePlayer() {

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getPlayer() {
        return player;
    }

    public void setPlayer(String player) {
        this.player = player;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    @Override
    public String toString() {
        return "GamePlayer{"+
                "id="+id+
                ",player='"+player+"\'"+
                ",score='"+score+"\'"+
                ",level='"+level+"\'"+
                "}";
    }
}

定义数据库操作类DatabaseAdapter和数据库帮手类DatabaseHelper
数据库操作类

package com.example.playermanager.db;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.playermanager.entity.GamePlayer;

import java.util.ArrayList;

//数据库工具类
public class DatabaseAdapter {
    private DatabaseHelper databaseHelper;
    public DatabaseAdapter(Context context){
        databaseHelper=new DatabaseHelper(context);
    }
    //添加操作
    public void add(GamePlayer gamePlayer){
        SQLiteDatabase db=databaseHelper.getWritableDatabase();
        String sql="insert into gameplayer(player,score,level) values(?,?,?)";
        Object[] arg={gamePlayer.getPlayer(),gamePlayer.getScore(),gamePlayer.getLevel()};
        db.execSQL(sql,arg);
        db.close();
    }

    //删除操作
    public void delete(int id){
        SQLiteDatabase db=databaseHelper.getWritableDatabase();
        String sql="delete from gameplayer where _id=?";
        Object[] args={id};
        db.execSQL(sql,args);
        db.close();
    }

    //修改操作
    public void update(GamePlayer gamePlayer){
        SQLiteDatabase db=databaseHelper.getWritableDatabase();
        String sql="update gameplayer set player=?,score=?,level=? where _id=?";
        Object[] args={gamePlayer.getPlayer(),gamePlayer.getScore(),gamePlayer.getLevel(),gamePlayer.getId()};
        db.execSQL(sql,args);
        db.close();
    }

    //条件查询
    public GamePlayer findById(int id){
        SQLiteDatabase db=databaseHelper.getReadableDatabase();
        String sql="select _id,player,score,level from gameplayer where _id=?";
        Cursor c=db.rawQuery(sql,new String[]{String.valueOf(id)});
        GamePlayer gamePlayer=null;
        if (c.moveToNext()){
            gamePlayer=new GamePlayer();
            gamePlayer.setId(c.getInt(c.getColumnIndexOrThrow(GameMetaData.GamePlayer._ID)));
            gamePlayer.setPlayer(c.getString(c.getColumnIndexOrThrow(GameMetaData.GamePlayer.PLAYER)));
            gamePlayer.setScore(c.getInt(c.getColumnIndexOrThrow(GameMetaData.GamePlayer.SCORE)));
            gamePlayer.setLevel(c.getInt(c.getColumnIndexOrThrow(GameMetaData.GamePlayer.LEVEL)));
        }
        c.close();
        db.close();
        return gamePlayer;
    }

    //全部查询
    public ArrayList<GamePlayer> findAll(){
        SQLiteDatabase db=databaseHelper.getReadableDatabase();
        String sql="select _id,player,score,level from gameplayer";
        Cursor c=db.rawQuery(sql,null);
        ArrayList<GamePlayer> gamePlayers=new ArrayList<>();
        GamePlayer gamePlayer=null;
        while (c.moveToNext()){
            gamePlayer=new GamePlayer();
            gamePlayer.setId(c.getInt(c.getColumnIndexOrThrow(GameMetaData.GamePlayer._ID)));
            gamePlayer.setPlayer(c.getString(c.getColumnIndexOrThrow(GameMetaData.GamePlayer.PLAYER)));
            gamePlayer.setScore(c.getInt(c.getColumnIndexOrThrow(GameMetaData.GamePlayer.SCORE)));
            gamePlayer.setLevel(c.getInt(c.getColumnIndexOrThrow(GameMetaData.GamePlayer.LEVEL)));
            gamePlayers.add(gamePlayer);
        }
        c.close();
        db.close();
        return gamePlayers;
    }

    public int getCount(){
        int count=0;
        String sql="select count(_id) from gameplayer";
        SQLiteDatabase db=databaseHelper.getReadableDatabase();
        Cursor c=db.rawQuery(sql,null);
        c.moveToFirst();
        count=c.getInt(0);
        c.close();
        db.close();
        return count;
    }
}

数据库帮手类

package com.example.playermanager.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.print.PrinterId;

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DB_NAME="game.db";
    private static final int VERSION=1;
    private static final String CREATE_TABLE_PLAYER="create table if not exists gameplayer("+
            "_id integer primary key autoincrement,"+
            "player text,score integer,level integer)";
    private static final String DROP_TABLE_PLAYER="drop table if exists gameplayer";
    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_PLAYER);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(DROP_TABLE_PLAYER);
        db.execSQL(CREATE_TABLE_PLAYER);
    }
}

GamePlayerFragment用于显示(列表)

package com.example.playermanager.fragments;


import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.app.Fragment;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.example.playermanager.R;
import com.example.playermanager.entity.GamePlayer;

import java.util.ArrayList;

/**
 * 列表界面
 * A simple {@link Fragment} subclass.
 */
public class GamePlayerFragment extends Fragment {
    private GamePlayerFragmentListener gamePlayerFragmentListener;
    private GamePlayerAdapter gamePlayerAdapter;

    //回调接口
    public static interface GamePlayerFragmentListener{
        public void showGamePlayFragment();
        public void showUpdateFragment(int id);
        public void delete(int id);
        public ArrayList<GamePlayer> findAll();

    }

    public GamePlayerFragment() {
        // Required empty public constructor
    }

    //实例化
    public static GamePlayerFragment newInstance(){
        GamePlayerFragment gamePlayerFragment=new GamePlayerFragment();
        return gamePlayerFragment;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            gamePlayerFragmentListener= (GamePlayerFragmentListener) activity;
        }catch (ClassCastException e){
            e.printStackTrace();
        }
    }

    //实例化
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ArrayList<GamePlayer> gamePlayers=gamePlayerFragmentListener.findAll();
        gamePlayerAdapter=new GamePlayerAdapter(getActivity(),gamePlayers);
    }

    //解除添加,销毁时调用
    @Override
    public void onDetach() {
        super.onDetach();
        gamePlayerFragmentListener=null;
    }

    public void changedData(){
        gamePlayerAdapter.setGamePlayers(gamePlayerFragmentListener.findAll());
        gamePlayerAdapter.notifyDataSetChanged();
    }

    //创建菜单项
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("修改/删除");
        menu.setHeaderIcon(android.R.drawable.ic_menu_edit);
        getActivity().getMenuInflater().inflate(R.menu.list_context_menu,menu);
    }

    //菜单选择事件
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.delete_menu:
                AdapterView.AdapterContextMenuInfo info= (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
                TextView textView_id=info.targetView.findViewById(R.id.textView_id);
                int id=Integer.parseInt(textView_id.getText().toString());
                gamePlayerFragmentListener.delete(id);
                changedData();
                break;
            case R.id.update_menu:
                info= (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
                textView_id=info.targetView.findViewById(R.id.textView_id);
                id=Integer.parseInt(textView_id.getText().toString());
                gamePlayerFragmentListener.showUpdateFragment(id);
                break;
        }
        return super.onContextItemSelected(item);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_game_player,container,false);
        ListView listView=view.findViewById(R.id.listView);
        registerForContextMenu(listView);//上下文菜单
        listView.setAdapter(gamePlayerAdapter);
        return view;
    }

    private static class GamePlayerAdapter extends BaseAdapter{

        private Context context;
        private ArrayList<GamePlayer> gamePlayers;
        public void setGamePlayers(ArrayList<GamePlayer> gamePlayers){
            this.gamePlayers=gamePlayers;
        }
        public GamePlayerAdapter(Context context,ArrayList<GamePlayer> gamePlayers){
            this.context=context;
            this.gamePlayers=gamePlayers;
        }
        @Override
        public int getCount() {
            return gamePlayers.size();
        }

        @Override
        public Object getItem(int position) {
            return gamePlayers.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder vh=null;
            if (convertView==null){
                convertView=LayoutInflater.from(context).inflate(R.layout.game_player_layout,null);
                vh=new ViewHolder();
                vh.tv_id=convertView.findViewById(R.id.textView_id);
                vh.tv_player=convertView.findViewById(R.id.textView_player);
                vh.tv_score=convertView.findViewById(R.id.textView_score);
                vh.tv_level=convertView.findViewById(R.id.textView_level);
                convertView.setTag(vh);
            }else {
                vh= (ViewHolder) convertView.getTag();
            }
            GamePlayer gamePlayer=gamePlayers.get(position);
            vh.tv_id.setText(String.valueOf(gamePlayer.getId()));
            vh.tv_player.setText(gamePlayer.getPlayer());
            vh.tv_score.setText(String.valueOf(gamePlayer.getScore()));
            vh.tv_level.setText(String.valueOf(gamePlayer.getLevel()));
            return convertView;
        }

        private static class ViewHolder{
            TextView tv_id;
            TextView tv_player;
            TextView tv_score;
            TextView tv_level;
        }
    }
}

菜单项list_context_menu

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/delete_menu"
        android:orderInCategory="100" android:title="删除"
        android:icon="@android:drawable/ic_menu_delete"/>
    <item android:id="@+id/update_menu"
        android:orderInCategory="200" android:title="修改"
        android:icon="@android:drawable/ic_menu_edit"/>
</menu>

对应布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".fragments.GamePlayerFragment">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listView"
        android:layout_gravity="center"
        android:choiceMode="none"/>

</FrameLayout>

listView显示内容

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


    <TextView
        android:id="@+id/textView_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="id"
        android:textSize="24sp"/>

    <TextView
        android:id="@+id/textView_player"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="玩家"
        android:textSize="24sp"/>

    <TextView
        android:id="@+id/textView_score"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="分数"
        android:textSize="24sp"/>

    <TextView
        android:id="@+id/textView_level"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="关卡数"
        android:textSize="24sp"/>
</LinearLayout>

AddFragment中使用Dialog来添加玩家

package com.example.playermanager.fragments;


import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

import com.example.playermanager.R;
import com.example.playermanager.entity.GamePlayer;

/**
 * 添加界面
 * A simple {@link Fragment} subclass.
 */
public class AddFragment extends DialogFragment {
    private AddFragmentListener addFragmentListener;//定义接口

    //回调接口
    public static interface AddFragmentListener{
        public void add(GamePlayer gamePlayer);
    }

    public AddFragment() {
        // Required empty public constructor
    }

    //实例化
    public static AddFragment newInstance(){
        AddFragment addFragment=new AddFragment();
        return addFragment;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try{
            addFragmentListener= (AddFragmentListener) activity;
        }catch (ClassCastException e){
            e.printStackTrace();
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final View view=LayoutInflater.from(getActivity()).inflate(R.layout.fragment_add,null);
        return new AlertDialog.Builder(getActivity())
                .setIcon(android.R.drawable.ic_menu_add)
                .setView(view)
                .setTitle("新增游戏玩家")
                .setPositiveButton("保存",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                EditText et_player=view.findViewById(R.id.editText_player);
                                EditText et_score=view.findViewById(R.id.editText_score);
                                EditText et_level=view.findViewById(R.id.editText_level);
                                GamePlayer gamePlayer=new GamePlayer();
                                gamePlayer.setPlayer(et_player.getText().toString());
                                gamePlayer.setScore(Integer.parseInt(et_score.getText().toString()));
                                gamePlayer.setLevel(Integer.parseInt(et_level.getText().toString()));
                                addFragmentListener.add(gamePlayer);
                                dialog.dismiss();
                            }
                        }
                )
                .setNegativeButton("取消",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        }
                )
                .create();
    }

}

对应布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".fragments.AddFragment">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:hint="请输入玩家姓名..."
        android:ems="10"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:id="@+id/editText_player"/>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:hint="请输入玩家分数..."
        android:ems="10"
        android:layout_below="@id/editText_player"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:id="@+id/editText_score"/>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:hint="请输入玩家关卡数..."
        android:ems="10"
        android:layout_below="@id/editText_score"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:id="@+id/editText_level"/>

</RelativeLayout>

UpdateFragment显示一个玩家数据并可以修改

package com.example.playermanager.fragments;


import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.example.playermanager.R;
import com.example.playermanager.entity.GamePlayer;

/**
 * 更新界面
 * A simple {@link Fragment} subclass.
 */
public class UpdataFragment extends Fragment implements View.OnClickListener {
    private EditText et_player,et_score,et_level;
    private UpdataFragmentListener updataFragmentListener;
    private GamePlayer gamePlayer;

    //回调接口
    public static interface UpdataFragmentListener{
        public void update(GamePlayer gamePlayer);
        public GamePlayer findById(int id);
    }

    public UpdataFragment() {
        // Required empty public constructor
    }

    //实例化
    public static UpdataFragment newInstance(int id){
        UpdataFragment updataFragment=new UpdataFragment();
        Bundle b=new Bundle();
        b.putInt("id",id);
        updataFragment.setArguments(b);
        return updataFragment;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try{
            updataFragmentListener= (UpdataFragmentListener) activity;
        }catch (ClassCastException e){
            e.printStackTrace();
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        updataFragmentListener=null;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int id=getArguments().getInt("id");
        gamePlayer=updataFragmentListener.findById(id);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_updata,container,false);
        TextView tv_id=view.findViewById(R.id.text_id2);
        et_player=view.findViewById(R.id.edit_player);
        et_score=view.findViewById(R.id.edit_score);
        et_level=view.findViewById(R.id.edit_level);
        Button button_save=view.findViewById(R.id.button_save);
        Button button_cancel=view.findViewById(R.id.button_cancel);
        button_save.setOnClickListener(this);
        button_cancel.setOnClickListener(this);
        tv_id.setText(String.valueOf(gamePlayer.getId()));
        et_player.setText(gamePlayer.getPlayer());
        et_score.setText(String.valueOf(gamePlayer.getScore()));
        et_level.setText(String.valueOf(gamePlayer.getLevel()));
        return view;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button_save:
                save();
                break;
            case R.id.button_cancel:
                getActivity().getFragmentManager().popBackStack();
                break;
        }
    }

    private void save(){
        GamePlayer g=new GamePlayer();
        g.setId(gamePlayer.getId());
        g.setPlayer(et_player.getText().toString());
        g.setScore(Integer.parseInt(et_score.getText().toString()));
        g.setLevel(Integer.parseInt(et_level.getText().toString()));
        updataFragmentListener.update(g);
        getActivity().getFragmentManager().popBackStack();
    }
}

对应布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".fragments.UpdataFragment">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/linear_id">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/text_id"
            android:text="ID:"
            android:textSize="24sp"/>

        <TextView
            android:id="@+id/text_id2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="24sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/linear_id"
        android:orientation="horizontal"
        android:id="@+id/linear_player">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/text_player"
            android:text="玩家:"
            android:textSize="24sp"/>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/edit_player"
            android:inputType="textPersonName"
            android:hint="请输入玩家名称..."
            android:textSize="24sp"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/linear_player"
        android:orientation="horizontal"
        android:id="@+id/linear_score">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/text_score"
            android:text="分数:"
            android:textSize="24sp"/>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/edit_score"
            android:inputType="number"
            android:hint="请输入玩家分数..."
            android:textSize="24sp"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/linear_score"
        android:orientation="horizontal"
        android:id="@+id/linear_level">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/text_level"
            android:text="关卡:"
            android:textSize="24sp"/>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/edit_level"
            android:inputType="number"
            android:hint="请输入关卡数..."
            android:textSize="24sp"/>
    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal"
        android:id="@+id/linear_button">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button_cancel"
            android:background="@drawable/button_bg"
            android:text="取消"
            android:textSize="24sp"
            android:layout_weight="1"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/button_bg"
            android:id="@+id/button_save"
            android:text="保存"
            android:textSize="24sp"
            android:layout_weight="1"/>
    </LinearLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/text"
        android:text="提示:您可以修改玩家、分数和关卡,序号不能修改,修改完成后点击保存按钮即可,否则点击取消按钮返回列表界面。"
        android:textColor="@android:color/darker_gray"
        android:textSize="18sp"
        android:layout_above="@id/linear_button"/>
</RelativeLayout>

MainActivityd调用方法

package com.example.playermanager;

import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;

import com.example.playermanager.db.DatabaseAdapter;
import com.example.playermanager.entity.GamePlayer;
import com.example.playermanager.fragments.AddFragment;
import com.example.playermanager.fragments.GamePlayerFragment;
import com.example.playermanager.fragments.UpdataFragment;

import java.util.ArrayList;

//程序入口
public class MainActivity extends AppCompatActivity implements AddFragment.AddFragmentListener, GamePlayerFragment.GamePlayerFragmentListener, UpdataFragment.UpdataFragmentListener {
    private GamePlayerFragment gamePlayerFragment;
    private UpdataFragment updataFragment;
    private DatabaseAdapter databaseAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        databaseAdapter=new DatabaseAdapter(this);
        showGamePlayFragment();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode==KeyEvent.KEYCODE_BACK){
            if (getFragmentManager().getBackStackEntryCount()==1){
                finish();
                return true;
            }else {
                getFragmentManager().popBackStack();
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id=item.getItemId();
        switch (id){
            case R.id.add:
                AddFragment createGamePlayerFragment=AddFragment.newInstance();
                createGamePlayerFragment.show(getFragmentManager(),null);
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void add(GamePlayer gamePlayer) {
        databaseAdapter.add(gamePlayer);
        gamePlayerFragment.changedData();
    }

    @Override
    public void showGamePlayFragment() {
        gamePlayerFragment=GamePlayerFragment.newInstance();
        FragmentTransaction fragmentTransaction=getFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.main_layout,gamePlayerFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }

    @Override
    public void showUpdateFragment(int id) {
        updataFragment=UpdataFragment.newInstance(id);
        FragmentTransaction fragmentTransaction=getFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.main_layout,updataFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }

    @Override
    public void delete(int id) {
        databaseAdapter.delete(id);
        gamePlayerFragment.changedData();
    }

    @Override
    public ArrayList<GamePlayer> findAll() {
        return databaseAdapter.findAll();
    }

    @Override
    public void update(GamePlayer gamePlayer) {
        databaseAdapter.update(gamePlayer);
        gamePlayerFragment.changedData();
    }

    @Override
    public GamePlayer findById(int id) {
        return databaseAdapter.findById(id);
    }
}

效果展示

Android学习——SQLite游戏玩家管理案例Android学习——SQLite游戏玩家管理案例Android学习——SQLite游戏玩家管理案例Android学习——SQLite游戏玩家管理案例Android学习——SQLite游戏玩家管理案例Android学习——SQLite游戏玩家管理案例