如果对SQLite还有疑惑(・∀・(・∀・(・∀・*)

不妨先阅读一下之前的一篇文章

https://blog.csdn.net/nishigesb123/article/details/89202726


概要设计

写在前面:下面只是个简单的案例,所以并不会考虑的太复杂,哈哈。

数据库设计

完成一个简单的游戏玩家信息管理,至少需要一张玩家信息表。

玩家信息表

玩家信息表需要包括下面的内容:

  1. 编号 id  (主键)int类型
  2. 玩家 palyer string类型
  3. 等级 level int类型
  4. 积分 score int类型

功能设计

  1. 显示游戏玩家列表,并且能够按分数进行一定的排序。
  2. 管理员可手动修改每个玩家的数据
  3. 管理员可单击后可以单独查看一个玩家的数据
  4. 管理员可删除一个玩家的数据

技术要点

UI组件及布局:

  • Activity和Fragment
  • ListView列表组件
  • 菜单

数据库技术:

  • SQLite

功能实现思路

  1. 定义元数据类:GameMetaData
  2. 表结构数据内部类:GamePlayer
  3. 定义数据库操作类:DatabaseAdaper&DatabaseHelper
  4. 用于界面(列表)显示:MainActivity和GamePlayerFragment
  5. 添加玩家:在AddFragment中使用Dialog
  6. 修改显示玩家数据:UpdateFragment

具体实现


数据库相关

这部分是 元数据类、表结构数据内部类、定义数据库操作类 三部分

这三个类的书写规范已经在https://blog.csdn.net/nishigesb123/article/details/89202726文章中很清楚了

故该部分只给出必要的说明和源码

为了让项目结构更优雅,新建一个包,存放数据库操作类、元数据类等内容

实体类放entity包

实体类GamePlayer

一开始当然是实体类(表结构数据内部类)

我们建一个entity包,新建一个GamePlayer类,这个没什么好注意的,和数据库字段一一对应即可。

生成对应的构造方法、get、set、toString方法

package com.example.a4_12sqlitemanager.entity;public class GamePlayer {private int id; //编号private String player; //玩家名称private int level; //玩家等级private int score; //玩家积分public GamePlayer(int id, String player, int level, int score) {this.id = id;this.player = player;this.level = level;this.score = score;}public GamePlayer(String player, int level, int score) {this.player = player;this.level = level;this.score = score;}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 getLevel() {return level;}public void setLevel(int level) {this.level = level;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}@Overridepublic String toString() {return "GamePlayer{" +"id=" + id +", player='" + player + '\'' +", level=" + level +", score=" + score +'}';}
}

元数据类(GameMetaData)

这个也比较简单,没啥好注意的,定义一些静态常量,实际上就是统一一下书写格式。

所以这个类应该被称为元数据类吗?留个疑惑(・∀・(・∀・(・∀・*)

package com.example.a4_12sqlitemanager.db;import android.provider.BaseColumns;public final class GameMetaData {private GameMetaData(){}public static abstract class GamePlayer implements BaseColumns {public static final String TABLE_NAME = "player_table";public static final String PLAYER = "player";public static final String SCORE = "score";public static final String LEVEL = "level";}
}

数据库操作工具类(DatabaseAdapter&DatabaseHelper

DatabaseHelper: 

package com.example.a4_12sqlitemanager.db;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;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_PLATER="CREATE TABLE IF NOT EXISTS player_table("+"_id INTEGER PRIMARY KEY AUTOINCREMENT,"+"player TEXT,score INTEGER,level INTEGER)";//删表private static final String DROP_TABLE_PLAYER = "DROP TABLE IF EXISTS player_table";public DatabaseHelper(Context context) {super(context, DB_NAME, null, VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_TABLE_PLATER);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL(DROP_TABLE_PLAYER);db.execSQL(CREATE_TABLE_PLATER);}
}

DatabaseAdapter:(增删改查文章和之前文章里的内容都一样,直接copy改一下即可)

package com.example.a4_12sqlitemanager.db;import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;import com.example.a4_12sqlitemanager.entity.GamePlayer;import java.util.ArrayList;//数据库操作工具类
public class DatabaseAdapter {private DatabaseHelper dbHelper;public DatabaseAdapter(Context context){dbHelper=new DatabaseHelper(context);}//添加操作public void add(GamePlayer gamePlayer){SQLiteDatabase db= dbHelper.getWritableDatabase();ContentValues values=new ContentValues();values.put(GameMetaData.GamePlayer.PLAYER,gamePlayer.getPlayer());values.put(GameMetaData.GamePlayer.SCORE,gamePlayer.getScore());values.put(GameMetaData.GamePlayer.LEVEL,gamePlayer.getLevel());db.insert(GameMetaData.GamePlayer.TABLE_NAME,null,values);db.close();}//删除操作public void delete(int id){SQLiteDatabase db= dbHelper.getWritableDatabase();String whereClause=GameMetaData.GamePlayer._ID+"=?";String[] whereArgs={String.valueOf(id)};//表名,条件,条件的值db.delete(GameMetaData.GamePlayer.TABLE_NAME,whereClause,whereArgs);db.close();}//更新操作public void update(GamePlayer gamePlayer){SQLiteDatabase db= dbHelper.getWritableDatabase();ContentValues values=new ContentValues();values.put(GameMetaData.GamePlayer.PLAYER,gamePlayer.getPlayer());values.put(GameMetaData.GamePlayer.SCORE,gamePlayer.getScore());values.put(GameMetaData.GamePlayer.LEVEL,gamePlayer.getLevel());String whereClause=GameMetaData.GamePlayer._ID+"=?";String[] whereArgs={String.valueOf(gamePlayer.getId())};db.update(GameMetaData.GamePlayer.TABLE_NAME,values,whereClause,whereArgs);db.close();}//查询public GamePlayer findById(int id){SQLiteDatabase db=dbHelper.getReadableDatabase();Cursor c= db.query(true,GameMetaData.GamePlayer.TABLE_NAME,null,GameMetaData.GamePlayer._ID+"=?",new String[]{String.valueOf(id)},null,null,null,null);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(){String sql="select _id,player,score,level from player_table order by score desc";SQLiteDatabase db=dbHelper.getReadableDatabase();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 player_table";SQLiteDatabase db=dbHelper.getReadableDatabase();Cursor c=db.rawQuery(sql,null);c.moveToFirst();count=c.getInt(0);c.close();db.close();return count;}
}

再设计一下界面

界面显示


为了项目结构更加优雅——

准备一个Fragments放Fragment的相关实现

一共需要三个Fragment

  1. AddFragment
  2. GamePlayerFragment
  3. UpdateFragment

activity_main.xml

主界面布局是最简单的,只需要设置一个FrameLayout来放置接下来要配置的三个Fragment

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/main_layout"></FrameLayout></android.support.constraint.ConstraintLayout>

MainActivity

这部分其实应该最后写,

implements AddFragment.AddFragmentListener, GamePlayerFragment.GamePlayerFragmentListener, UpdateFragment.UpdateFragmentListener

之后,把改重写的方法名先加上去,具体的内容,在后面完成对应Fragment后再补上。

package com.example.a4_12sqlitemanager;import android.support.v4.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.a4_12sqlitemanager.Fragments.AddFragment;
import com.example.a4_12sqlitemanager.Fragments.GamePlayerFragment;
import com.example.a4_12sqlitemanager.Fragments.UpdateFragment;
import com.example.a4_12sqlitemanager.db.DatabaseAdapter;
import com.example.a4_12sqlitemanager.entity.GamePlayer;import java.util.ArrayList;//三个接口分别实现
//AddFragment.AddFragmentListener, GamePlayerFragment.GamePlayerFragmentListener, UpdateFragment.UpdateFragmentListener
public class MainActivity extends AppCompatActivity implements AddFragment.AddFragmentListener, GamePlayerFragment.GamePlayerFragmentListener, UpdateFragment.UpdateFragmentListener {private GamePlayerFragment gamePlayerFragment;private UpdateFragment updateFragment;//各个Fragment可能都会用到,所以放在这里private DatabaseAdapter dbAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//dbAdapter就可以调用增删改查所有方法了dbAdapter=new DatabaseAdapter(this);//一开始就要直接显示...showGamePlayerFragment();}/***菜单***/public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_main, menu);return true;}//如果点击了添加...@Overridepublic 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);}/***菜单***/@Overridepublic void add(GamePlayer gamePlayer) {dbAdapter.add(gamePlayer);//更新列表gamePlayerFragment.changedData();}@Overridepublic void showGamePlayerFragment() {gamePlayerFragment=GamePlayerFragment.newInstance();FragmentTransaction ft = getSupportFragmentManager().beginTransaction();ft.replace(R.id.main_layout,gamePlayerFragment);ft.addToBackStack(null);ft.commit();}@Overridepublic void showUpdateFragment(int id) {updateFragment=UpdateFragment.newInstance(id);FragmentTransaction ft=getSupportFragmentManager().beginTransaction();ft.replace(R.id.main_layout,updateFragment);ft.addToBackStack(null);ft.commit();}@Overridepublic void delete(int id) {dbAdapter.delete(id);gamePlayerFragment.changedData();}@Overridepublic ArrayList<GamePlayer> findAll() {return dbAdapter.findAll();}//更新时也要更新界面数据,所以调用一下gamePlayerFragment的changeDate@Overridepublic void update(GamePlayer gamePlayer) {dbAdapter.update(gamePlayer);gamePlayerFragment.changedData();}@Overridepublic GamePlayer findById(int id) {return dbAdapter.findById(id);}//按下BACk键@Overridepublic 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);}}

AddFragment

继承DialogFragment,界面以对话框的形式实现

重写onCreateDialog需要自定义一个view(布局)

create_gameplayer_dialog.xml

<?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"android:padding="16dp"><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:inputType="textPersonName"android:hint="请输入玩家名称"android:ems="10"android:id="@+id/editText_player"android:layout_alignParentTop="true"android:layout_alignParentStart="true"android:layout_alignParentEnd="true"android:layout_alignParentRight="true"android:layout_alignParentLeft="true" /><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:inputType="number"android:ems="10"android:layout_marginTop="5dp"android:hint="请输入玩家分数"android:id="@+id/editText2_score"android:layout_alignParentStart="true"android:layout_below="@+id/editText_player"android:layout_alignParentEnd="true"android:layout_alignParentLeft="true"android:layout_alignParentRight="true" /><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:inputType="number"android:ems="10"android:hint="请输入玩家等级"android:layout_marginTop="5dp"android:id="@+id/editText3_level"android:layout_alignParentStart="true"android:layout_below="@+id/editText2_score"android:layout_alignParentEnd="true"android:layout_alignParentLeft="true"android:layout_alignParentRight="true" /></RelativeLayout>

此外,添加实际上是通过一个菜单项来添加

所以额外地,需要一个menu

menu_main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><item android:id="@+id/add" android:title="添加"android:icon="@android:drawable/ic_menu_add"android:orderInCategory="100" app:showAsAction="always"/>
</menu>

最后是完整的AddFragment.java代码

package com.example.a4_12sqlitemanager.Fragments;import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;import com.example.a4_12sqlitemanager.R;
import com.example.a4_12sqlitemanager.entity.GamePlayer;/*** A simple {@link Fragment} subclass.*/
//导app下的DialogFragment包
public class AddFragment extends DialogFragment {//接口进行定义private AddFragmentListener addFragmentListener;//通过回调接口 实现 Fragment和Activity进行交互public static interface AddFragmentListener {public void add(GamePlayer gamePlayer);}//创建Fragmentpublic static AddFragment newInstance() {AddFragment frag = new AddFragment();return frag;}public AddFragment() {// Required empty public constructor}//强制转换Listener@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);try {addFragmentListener = (AddFragmentListener) activity;} catch (ClassCastException e) {e.printStackTrace();}}//重写onCreateDialog@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {//自定义一个viewfinal View view = LayoutInflater.from(getActivity()).inflate(R.layout.create_gameplayer_dialog, null);return new AlertDialog.Builder(getActivity()).setIcon(android.R.drawable.ic_input_add).setView(view).setTitle("新增游戏玩家").setPositiveButton("保存",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//获取值  从view里拿到EditTextEditText et_player = view.findViewById(R.id.editText_player);EditText et_score = view.findViewById(R.id.editText2_score);EditText et_level = view.findViewById(R.id.editText3_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() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}}).create();}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_add, container, false);}}

GamePlayerFragment

涉及信息的显示,

对应布局文件fragment_game_player.xml需要一个listview

<?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"><ListViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/listView"android:layout_gravity="center"android:choiceMode="none"/></FrameLayout>

为listview列表项还需要提供一个自定义布局game_player_list_item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"xmlns:app="http://schemas.android.com/apk/res-auto"android:padding="16dp"><TextViewandroid:id="@+id/text_id"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent"android:text="序号:" /><TextViewandroid:id="@+id/textView_id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="此处会显示玩家ID"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toEndOf="@+id/text_id" /><TextViewandroid:id="@+id/text_player"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/text_id"android:text="玩家:" /><TextViewandroid:id="@+id/textView_player"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="此处会显示玩家名称"app:layout_constraintTop_toBottomOf="@+id/text_id"app:layout_constraintStart_toEndOf="@+id/text_player"/><TextViewandroid:id="@+id/text_score"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/text_player"android:text="分数:" /><TextViewandroid:id="@+id/textView_score"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintTop_toBottomOf="@+id/text_player"android:text="此处会显示玩家分数"app:layout_constraintStart_toEndOf="@+id/text_score" /><TextViewandroid:id="@+id/text_level"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/text_score"android:text="等级:" /><TextViewandroid:id="@+id/textView_level"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintTop_toBottomOf="@+id/text_score"android:text="此处会显示玩家等级"app:layout_constraintStart_toEndOf="@+id/text_level" /></android.support.constraint.ConstraintLayout>

点击列表项会弹出对话框,这里需要一个菜单项的文件listview_context_menu.xml

<?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="100"android:title="修改"android:icon="@android:drawable/ic_menu_edit"/>
</menu>

最后是完整的GamePlayerFragment.java代码

package com.example.a4_12sqlitemanager.Fragments;import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.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.a4_12sqlitemanager.R;
import com.example.a4_12sqlitemanager.entity.GamePlayer;import java.util.ArrayList;/*** A simple {@link Fragment} subclass.*/
public class GamePlayerFragment extends Fragment {//接口进行定义private GamePlayerFragmentListener gamePlayerFragmentListener;private GamePlayerAdapter gamePlayerAdapter;//通过回调接口 实现 Fragment和Activity进行交互public static interface GamePlayerFragmentListener{public void showGamePlayerFragment();public void showUpdateFragment(int id);public void delete(int id);public ArrayList<GamePlayer> findAll();}//创建Fragmentpublic static GamePlayerFragment newInstance(){GamePlayerFragment frag = new GamePlayerFragment();return frag;}public GamePlayerFragment() {// Required empty public constructor}//强制转换Listener@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);try {gamePlayerFragmentListener = (GamePlayerFragmentListener) activity;} catch (ClassCastException e) {e.printStackTrace();}}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ArrayList<GamePlayer> gamePlayers = gamePlayerFragmentListener.findAll();//在onCreate进行实例化gamePlayerAdaptergamePlayerAdapter=new GamePlayerAdapter(getActivity(),gamePlayers);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {//实例化viewView 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;}@Overridepublic int getCount() {return gamePlayers.size();}@Overridepublic Object getItem(int position) {return gamePlayers.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder vh = null;if(convertView == null){convertView = LayoutInflater.from(context).inflate(R.layout.game_player_list_item_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 g=gamePlayers.get(position);vh.tv_id.setText(String.valueOf(g.getId()));vh.tv_player.setText(g.getPlayer());vh.tv_score.setText(String.valueOf(g.getScore()));vh.tv_level.setText(String.valueOf(g.getLevel()));return convertView;}private static class ViewHolder{TextView tv_id;TextView tv_player;TextView tv_score;TextView tv_level;}}//创建菜单项@Overridepublic 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.listview_context_menu,menu);}//销毁的时候置空...@Overridepublic void onDetach(){super.onDetach();gamePlayerFragmentListener=null;}//提供删除和修改两个操作@Overridepublic 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);}//数据发生变化,重新查询public void changedData(){gamePlayerAdapter.setGamePlayers(gamePlayerFragmentListener.findAll());gamePlayerAdapter.notifyDataSetChanged();}}

UpdateFragment

首先还是布局文件fragment_update.xml

<?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.UpdateFragment"android:padding="16dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/textView_id"android:layout_alignParentEnd="true"android:layout_toEndOf="@id/textView6"android:layout_alignParentTop="true"android:layout_alignParentRight="true"android:layout_toRightOf="@id/textView6" /><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:inputType="textPersonName"android:hint="请输入玩家名称"android:id="@+id/editText_player"android:layout_below="@+id/textView_id"android:layout_marginTop="5dp"android:layout_alignParentEnd="true"android:layout_toEndOf="@+id/textView6"android:layout_alignParentRight="true"android:layout_toRightOf="@+id/textView6" /><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:inputType="number"android:ems="10"android:layout_marginTop="5dp"android:hint="请输入玩家分数"android:id="@+id/editText2_score"android:layout_below="@id/editText_player"android:layout_alignParentEnd="true"android:layout_toEndOf="@id/textView7"android:layout_alignParentRight="true"android:layout_toRightOf="@id/textView7" /><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:inputType="number"android:ems="10"android:hint="请输入玩家关卡数"android:layout_marginTop="5dp"android:id="@+id/editText3_level"android:layout_below="@+id/editText2_score"android:layout_alignParentEnd="true"android:layout_toEndOf="@id/textView8"android:layout_alignParentRight="true"android:layout_toRightOf="@id/textView8" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_alignParentBottom="true"android:layout_alignParentStart="true"android:id="@+id/linearLayout"android:layout_alignParentLeft="true"><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="取消"android:background="@drawable/button_bg"android:id="@+id/button_cancel"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="更新"android:id="@+id/button_save"android:background="@drawable/button_bg"/></LinearLayout><TextViewandroid:id="@+id/textView5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/textView_id"android:layout_alignParentStart="true"android:text="序号:"android:layout_alignParentLeft="true" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="玩家:"android:id="@+id/textView6"android:layout_alignBaseline="@+id/editText_player"android:layout_alignParentStart="true"android:layout_alignParentLeft="true" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="分数:"android:id="@+id/textView7"android:layout_alignBaseline="@+id/editText2_score"android:layout_alignParentStart="true"android:layout_alignParentLeft="true" /><TextViewandroid:id="@+id/textView8"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:text="等级:"android:layout_alignBaseline="@+id/editText3_level"android:layout_alignParentLeft="true" /><TextViewandroid:id="@+id/textView9"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_above="@+id/linearLayout"android:layout_alignParentStart="true"android:layout_alignParentLeft="true"android:text="提示:您可以修改序号以外的信息,修改完成后注意保存,取消则按钮返回列表界面。"android:textColor="@android:color/darker_gray" /></RelativeLayout>

按钮(背景)进行了一下设计... drawable文件夹下建一个button_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true" android:drawable="@color/colorPrimary"/><item android:drawable="@android:color/transparent"/>
</selector>

完整的UpdateFragment.java

package com.example.a4_12sqlitemanager.Fragments;import android.app.Activity;
import android.os.Bundle;
import android.support.v4.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.a4_12sqlitemanager.R;
import com.example.a4_12sqlitemanager.entity.GamePlayer;/*** A simple {@link Fragment} subclass.*/
public class UpdateFragment extends Fragment implements View.OnClickListener{//组件声明(因为要多次用到所以..放最上面private EditText et_player,et_score,et_level;//接口进行定义private UpdateFragmentListener updateFragmentListener;private GamePlayer gamePlayer;//通过回调接口 实现 Fragment和Activity进行交互public static interface UpdateFragmentListener{public void update(GamePlayer gameePlayer);public GamePlayer findById(int id);}//创建Fragment(update需要一个参数id)public static UpdateFragment newInstance(int id){UpdateFragment updataFragment=new UpdateFragment();//通过Bundle(防止旋转丢失)Bundle b=new Bundle();b.putInt("id",id);updataFragment.setArguments(b);return updataFragment;}public UpdateFragment() {// Required empty public constructor}//强制转换Listener@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);try{updateFragmentListener = (UpdateFragmentListener) activity;}catch (ClassCastException e){e.printStackTrace();}}//在onCreate进行查询@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);int id = getArguments().getInt("id");gamePlayer = updateFragmentListener.findById(id);}//界面@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentView view = inflater.inflate(R.layout.fragment_update, container, false);TextView tv_id = view.findViewById(R.id.textView_id);et_player = view.findViewById(R.id.editText_player);et_score = view.findViewById(R.id.editText2_score);et_level = view.findViewById(R.id.editText3_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;}//点击事件@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.button_save:save();break;case R.id.button_cancel://取消,回退栈getActivity().getSupportFragmentManager().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()));updateFragmentListener.update(g);getActivity().getSupportFragmentManager().popBackStack();}//销毁置空...@Overridepublic void onDetach() {super.onDetach();updateFragmentListener = null;}
}

成品展示

新建信息&查询信息效果

修改信息效果

先加一条用于测试的记录,长按这条记录,效果如图2,修改界面如图3,修改信息并点击更新

可以看到信息已经发生了变化

删除信息效果

长按删除我们的记录2,点击后,如图所示,信息已成功删除

持久化技术——游戏玩家信息管理(基于 SQLite)相关推荐

  1. 用《王者荣耀》游戏玩家信息管理操作教会使用hbase

    一.任务描述 主要使用HBase shell的方式实现对王者荣耀游戏玩家信息表的操作,包括表的创建.删除及数据的插入.查询等操作. 二.了解并使用DDL操作创建王者荣耀玩家信息表 HBase Shel ...

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

    SQLite游戏玩家管理案例 功能设计 根据我们要展示的数据,设计一个排行榜后台管理功能包括: 1.显示游戏玩家列表,按分数降序 2.管理员可手动修改每个玩家的数据 3.管理员可单击后单独查看一个玩家 ...

  3. DeepMind爆发史:决定AI高峰的“游戏玩家”|深度学习崛起十年

    翻译|刘晓祯.沈佳丽.胡燕君.许晨阳.周亚坤 很少有人会否认,过去十年,AI领域最耀眼的明星组织当属DeepMind,没有之一. 那个震动世界的高光时刻发生在2016年3月的一天,AI选手AlphaG ...

  4. 手游开发商Plarium游戏玩家超3.8亿!揭秘新作《突袭: 暗影传说》制作流程

    以色列开发商Plarium Global是视频游戏行业中最成功的工作室之一,在全球拥有3.8亿游戏玩家的社区,有20多种游戏,从<维京人:氏族战争>和<风暴降落>系列的角色扮演 ...

  5. 游戏玩家的饕餮盛宴:“天生BUFF”竞力狂飙

    2019年7月23日,ROG玩家国度在北京凯迪拉克M空间召开了"天生BUFF"ROG 2019新品发布会,华硕集团董事长施崇棠.华硕共同执行长许先越.腾讯副总裁王波.京东集团副总裁 ...

  6. 计算机思维游戏推理论文,基于严肃游戏的计算思维培养

    摘要:在分析严肃游戏这一新兴的教学方式的基础上,提出基于严肃游戏培养计算思维能力的观点,以案例的形式讨论严肃游戏与计算思维能力培养的几种结合方式.介绍以各门专业知识为目的跨学科的严肃游戏文案设计训练. ...

  7. 为什么游戏玩家和开发者应该关心光线追踪

    Imagination在线课程上新!深入解读业界首个移动端光线追踪GPU架构 在上一篇文章中,我概述了新款IMG CXT GPU,并解释了为什么它能够在移动功率预算中为常规光栅化和光线追踪效果提供令人 ...

  8. 骁龙 730 正式发布:这回高通不挤牙膏了,还为游戏玩家带来大福利

    雷锋网消息,美国西部时间 4 月 9 日,高通在旧金山举行的 AI Day 上一口气发布了三款面向智能手机的骁龙 SoC,分别是 6 系的骁龙 665 和 7 系的骁龙 730 与骁龙 730G. 骁 ...

  9. 用amd组装高档游戏型计算机,AMD锐龙R5-2600搭配RTX2060组装电脑主机配置报价 游戏玩家看过来...

    在这段时间,intel处理器持续涨价,让不少装机目光投向了追求性价比的AMD装机方案.不得不说,AMD比较良心的是,intel处理器涨价期间,而AMD并没有任何跟风的举动,价格却保持不变,并且自家锐龙 ...

最新文章

  1. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用...
  2. Cacti性能优化和监控H3C交换机
  3. 增加mysql的sortbuffer_Mysql设置sort_buffer_size
  4. 牛客网暑期ACM多校训练营(第三场)A - PAXM Team(01背包)
  5. CodeForces - 1200E Compress Words(字符串哈希)
  6. 大神级的布线,人家攻城狮是如何做到的?
  7. 撬锁锤怎么用_安全锤是啥?消防蜀黍教你怎么选?如何快速破拆逃生?
  8. 通过思科构造局域网_cisco设备构建典型局域网
  9. Linux block
  10. 【英语学习】【Level 08】U05 Better option L1 Message sent
  11. 设计模式完结(12)-- 代理模式
  12. zedgraph画图
  13. SCWS中文分词,功能函数实例应用
  14. 使用 Python 进行线性搜索优化
  15. [转]_int64、long long 的区别
  16. 【转载】制作Ubuntu启动盘——详细记录,亲测有效
  17. 【移动应用趋势】2022 年值得关注的 15 大移动应用开发趋势
  18. 计算机主机中的硬件组成部分,电脑的硬件组成部分及其作用各是什么
  19. 亲戚关系(并查集(YYOJ
  20. 【nacos】springboot @Value @NacosValue 使用时可能无效

热门文章

  1. myet: 练习英语口语不错
  2. python把中文文档变为拼音
  3. 如何打造陆金所营销活动配置发布平台
  4. 基金疯魔,硬汉落泪!用Python看破藏在盈损动态里的道道儿
  5. 北京信息科技大学第十三届程序设计竞赛暨ACM选拔赛题解
  6. 双系统安装 win7
  7. node-opcua的使用 --- [2] 添加对象和变量
  8. 无法嵌入互操作类型“Application Class”请改用适用的接口
  9. 2023值得入手的小米电视推荐 小米75寸电视哪款性价比高?
  10. Java-009-数组和日期时间类(Date,Calendar)详解