三、数据存储管理
- 功能说明
需实现的具体功能为:数据的标准增、删、改、查操作。
- 结果截图



- 代码分析
(1)在MainActivity所在的包里,新建名为DbHelper的SQLite数据库打开助手类,其代码如下:
/* SQLite数据库打开助手DbHelper作为抽象类SQLiteOpenHelper的子类 需要重写2个抽象方法onCreate()和onUpgrade() */ public class DbHelper extends SQLiteOpenHelper{ public static final String TB_NAME = "friends"; //表名 //构造方法:第1参数为上下文,第2参数库库名,第3参数为游标工厂,第4参数为版本 public DbHelper(Context context, String dbname, CursorFactory factory, int version) { super(context, dbname, factory, version); //创建或打开数据库 } @Override public void onCreate(SQLiteDatabase db) { //当表不存在时,创建表;第一字段为自增长类型 db.execSQL("CREATE TABLE IF NOT EXISTS " + TB_NAME + "( _id integer primary key autoincrement," + "name varchar," + "age integer"+ ")"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 执行SQL命令 db.execSQL("DROP TABLE IF EXISTS " + TB_NAME); onCreate(db); } }
(2)在MainActivity所在的包里,新建名为MyDAO的数据库访问类,其代码如下:
/* 本类MyDAO调用了打开数据库的助手类DbHelper 本类MyDAO提供的CRUD针对数据库test.db的表friends 查询数据库表所有记录的方法:allQuery() 插入记录的方法:insertInfo(String name,int age) 删除记录的方法:deleteInfo(String selId) 修改记录方法:updateInfo(String name,int age,String selId) */ public class MyDAO { private SQLiteDatabase myDb; //类的成员 private DbHelper dbHelper; //类的成员 public MyDAO(Context context) { //构造方法,参数为上下文对象 //第1参数为上下文,第2参数为数据库名 dbHelper = new DbHelper(context,"test.db",null,1); } public Cursor allQuery(){ //查询所有记录 myDb = dbHelper.getReadableDatabase(); return myDb.rawQuery("select * from friends",null); } public int getRecordsNumber(){ //返回数据表记录数 myDb = dbHelper.getReadableDatabase(); Cursor cursor= myDb.rawQuery("select * from friends",null); return cursor.getCount(); } public void insertInfo(String name,int age){ //插入记录 myDb = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", name); values.put("age", age); long rowid=myDb.insert(DbHelper.TB_NAME, null, values); if(rowid==-1) Log.i("myDbDemo", "数据插入失败!"); else Log.i("myDbDemo", "数据插入成功!"+rowid); } public void deleteInfo(String selId){ //删除记录 String where = "_id=" + selId; int i = myDb.delete(DbHelper.TB_NAME, where, null); if (i > 0) Log.i("myDbDemo", "数据删除成功!"); else Log.i("myDbDemo", "数据未删除!"); } public void updateInfo(String name,int age,String selId){ //修改记录 //方法中的第三参数用于修改选定的记录 ContentValues values = new ContentValues(); values.put("name", name); values.put("age", age); String where="_id="+selId; int i=myDb.update(DbHelper.TB_NAME, values, where, null); //上面几行代码的功能可以用下面的一行代码实现 //myDb.execSQL("update friends set name = ? ,age = ? where _id = ?",new Object[]{name,age,selId}); if(i>0) Log.i("myDbDemo","数据更新成功!"); else Log.i("myDbDemo","数据未更新!"); } }
(3)MainActivity对应的主布局activity_main.xml
/*2个TextView:分别表示姓名和年龄; 2个EditText:id分别为et_name,et_age 3个Button按钮:id分别为bt_add,bt_modify,bt_del 1个ListView:id为listView */ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:addStatesFromChildren="true" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="姓名" android:textColor="?android:attr/textColorSecondary" /> <EditText android:id="@+id/et_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:singleLine="true" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:addStatesFromChildren="true" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="年龄" android:textColor="?android:attr/textColorSecondary" /> <EditText android:id="@+id/et_age" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:singleLine="true" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:addStatesFromChildren="true" android:gravity="center" > <Button android:id="@+id/bt_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="添加" /> <Button android:id="@+id/bt_modify" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="修改"/> <Button android:id="@+id/bt_del" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除" /> <!-- <Button android:id="@+id/bt_query" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询" android:onClick="querybutton" > </Button> --> </LinearLayout> <ListView android:gravity="center" android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="5dip" > </ListView>
(4)列表控件ListView使用的布局list_item.xml
/*一行上包含id为别为的tv_id、tvname和tvage的3个TextView控件*/ <?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="horizontal" > <TextView android:id="@+id/tv_id" android:textSize="25sp" android:layout_width="50dp" android:layout_height="wrap_content"/> <TextView android:id="@+id/tvname" android:textSize="25sp" android:layout_width="100dp" android:layout_height="wrap_content"/> <TextView android:id="@+id/tvage" android:textSize="25sp" android:layout_width="50dp" android:layout_height="wrap_content"/> </LinearLayout>
(5)MainActivity程序代码如下
/* 本程序中对数据库的插入操作和查询,使用了MyDAO类的相关方法 首次运行时,增加2条记录并使用ListView控件显示出来 */ public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private MyDAO myDAO; //数据库访问对象 private ListView listView; private List<Map<String,Object>> listData; private Map<String,Object> listItem; private SimpleAdapter listAdapter; private EditText et_name; //数据表包含3个字段,第1字段为自增长类型 private EditText et_age; private String selId=null; //选择项id @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button bt_add= (Button) findViewById(R.id.bt_add);bt_add.setOnClickListener(this); Button bt_modify=(Button)findViewById(R.id.bt_modify);bt_modify.setOnClickListener(this); Button bt_del=(Button)findViewById(R.id.bt_del);bt_del.setOnClickListener(this); et_name=(EditText)findViewById(R.id.et_name); et_age=(EditText)findViewById(R.id.et_age); myDAO = new MyDAO(this); //创建数据库访问对象 if(myDAO.getRecordsNumber()==0) { //防止重复运行时重复插入记录 myDAO.insertInfo("tian", 20); //插入记录 myDAO.insertInfo("wang", 40); //插入记录 } displayRecords(); //显示记录 } public void displayRecords(){ //显示记录方法定义 listView = (ListView)findViewById(R.id.listView); listData = new ArrayList<Map<String,Object>>(); Cursor cursor = myDAO.allQuery(); while (cursor.moveToNext()){ int id=cursor.getInt(0); //获取字段值 String name=cursor.getString(1); //int age=cursor.getInt(2); int age=cursor.getInt(cursor.getColumnIndex("age"));//推荐此种方式 listItem=new HashMap<String,Object>(); //必须在循环体里新建 listItem.put("_id", id); //第1参数为键名,第2参数为键值 listItem.put("name", name); listItem.put("age", age); listData.add(listItem); //添加一条记录 } listAdapter = new SimpleAdapter(this, listData, R.layout.list_item, //自行创建的列表项布局 new String[]{"_id","name","age"}, new int[]{R.id.tv_id,R.id.tvname,R.id.tvage}); listView.setAdapter(listAdapter); //应用适配器 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { //列表项监听 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Map<String,Object> rec= (Map<String, Object>) listAdapter.getItem(position); //从适配器取记录 et_name.setText(rec.get("name").toString()); //刷新文本框 et_age.setText(rec.get("age").toString()); Log.i("ly",rec.get("_id").toString()); selId=rec.get("_id").toString(); //供修改和删除时使用 } }); } @Override public void onClick(View v) { //实现的接口方法 if(selId!=null) { //选择了列表项后,可以增加/删除/修改 String p1 = et_name.getText().toString().trim(); int p2 = Integer.parseInt(et_age.getText().toString()); switch (v.getId()){ case R.id.bt_add: myDAO.insertInfo(p1,p2); break; case R.id.bt_modify: myDAO.updateInfo(p1,p2,selId); Toast.makeText(getApplicationContext(),"更新成功!",Toast.LENGTH_SHORT).show(); break; case R.id.bt_del: myDAO.deleteInfo(selId); Toast.makeText(getApplicationContext(),"删除成功!",Toast.LENGTH_SHORT).show(); et_name.setText(null);et_age.setText(null); selId=null; //提示 } }else{ //未选择列表项 if(v.getId()==R.id.bt_add) { //单击添加按钮 String p1 = et_name.getText().toString(); String p2=et_age.getText().toString(); if(p1.equals("")||p2.equals("")){ //要求输入了信息 Toast.makeText(getApplicationContext(),"姓名和年龄都不能空!",Toast.LENGTH_SHORT).show(); }else{ myDAO.insertInfo(p1, Integer.parseInt(p2)); //第2参数转型 } } else{ //单击了修改或删除按钮 Toast.makeText(getApplicationContext(),"请先选择记录!",Toast.LENGTH_SHORT).show(); } } displayRecords();//刷新ListView对象 } }
- 小结
DAO(Data Access Object)是一个数据访问接口,DbHelper创建一个SQLite数据库打开助手类。
MyDAO则写的是数据库访问类,由MainActivity调用。
浙公网安备 33010602011771号