下面通过一个完整的实例来展示如何进行数据库操作。由于实例中使用的方法在上一篇博文中都已经讲述过,因此不再对具体的方法进行分析,主要通过完整的实例让读者有一个宏观的认知实例将通过创建 100条模拟数据,用ListView 展示出来,同时在ListView中对数据进行删除和更新操作。最后演示如何进行数据库版本更新的操作。
在进行具体的数据库操作之前,先建立一个Java 实体类 User类,再通过这个实体类进行数据的封装。User类中包括 userId、name、age三个属性,具体代码如下:
- package com.rfstar.sqlitetest2;
- public class User {
- private int userId;
- private String name;
- private int age;
- public int getUserId()
- {
- return userId;
- }
- public void setUserId(int userId)
- {
- this.userId=userId;
- }
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name=name;
- }
- public int getAge()
- {
- return age;
- }
- public void setAge(int age)
- {
- this.age=age;
- }
- }
完成Java实体类的创建之后,通过继承SQLiteOpenHelper来实现数据库辅助类,并实现其中的onCeate()方法和onUpgrate()方法。在onCreate()方法中创建表并使表中的字段与User类的属性相一致。同时实现onUpgrate()方法,以更新数据库。
- package com.rfstar.sqlitetest2;
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteOpenHelper;
- public class OpenHelper extends SQLiteOpenHelper {
- private static final String name="test.db";
- private static final int version=1;
- public OpenHelper(Context context)
- {
- super(context,name,null,version);
- }
- @Override
- public void onCreate(SQLiteDatabase sqLiteDatabase) {
- sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS "+
- "user (person_id INTEGER PRIMARY KEY AUTOINCREMENT,"+
- "name varchar(32),age INTEGER)");
- }
- @Override
- public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
- if(newVersion>oldVersion)
- {
- sqLiteDatabase.execSQL("ALTER TABLE user ADD phone VARCHAR(11)");
- }
- }
- }
接下来创建UserDao类,并在该类中实现对User的增、删、改、查操作,代码如下:
- package com.rfstar.sqlitetest2;
- import android.content.ContentValues;
- import android.content.Context;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import java.util.ArrayList;
- import java.util.List;
- public class UserDao {
- private SQLiteDatabase database;
- public UserDao(SQLiteDatabase sqLiteDatabase) {
- this.database = sqLiteDatabase;
- }
- public boolean insert(User user) {
- ContentValues contentValues = new ContentValues();
- contentValues.put("name", user.getName());
- contentValues.put("age", user.getAge());
- long insertResult = database.insert("user", null, contentValues);
- if (insertResult == -1) {
- return false;
- }
- return true;
- }
- public boolean delete(User user) {
- int deleteResult = database.delete("user", "user_id+?", new String[]{user.getUserId() + ""});
- if (deleteResult == 0){
- return false;
- }
- return true;
- }
- public boolean update(User user)
- {
- ContentValues contentValues=new ContentValues();
- contentValues.put("name",user.getName());
- contentValues.put("age",user.getAge());
- int updateResult=database.update("user",contentValues,"user_id=?",new String[]{user.getUserId()+""});
- if(updateResult==0)
- {
- return false;
- }
- return true;
- }
- public User queryOne(User user)
- {
- Cursor cursor=database.query("user",null,"name=?",new String[]
- {user.getName()},null,null,null);
- while (cursor.moveToNext())
- {
- user.setUserId(cursor.getInt(0));
- user.setAge(cursor.getInt(2));
- }
- return user;
- }
- public List<User> queryAll()
- {
- List<User> userList=new ArrayList<>();
- Cursor cursor=database.query("user",null,null,null,null,null,null);
- while (cursor.moveToNext())
- {
- User user=new User();
- user.setUserId(cursor.getInt(0));
- user.setName(cursor.getString(1));
- user.setAge(cursor.getInt(2));
- userList.add(user);
- }
- return userList;
- }
- }
当完成上述3个类之后,接下来就可以使用Activity进行各项操作了(1)创建数据
创建一个MainActivity,并在MainActivity中创建一个循环生成100条数据的方法,代码如下:
- package com.rfstar.sqlitetest2;
- import androidx.appcompat.app.AppCompatActivity;
- import android.database.sqlite.SQLiteDatabase;
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.ListView;
- import android.widget.SimpleAdapter;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- public class MainActivity extends AppCompatActivity {
- private OpenHelper openHelper;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- openHelper=new OpenHelper(this);
- initData();
- }
- private void initData()
- {
- SQLiteDatabase sqLiteDatabase=openHelper.getReadableDatabase();
- UserDao userDao=new UserDao(sqLiteDatabase);
- sqLiteDatabase.beginTransaction();
- try
- {
- User user=new User();
- for(int i=0;i<100;i++)
- {
- user.setName("大鸟科创空间"+i);
- user.setAge(6);
- userDao.insert(user);
- }
- sqLiteDatabase.setTransactionSuccessful();
- }catch (Exception e)
- {
- Log.e("user Transaction",e.toString());
- }finally {
- sqLiteDatabase.endTransaction();
- sqLiteDatabase.close();
- }
- }
- }
此时运行程序在手机上,数据就创建成功了。我们将在下一部分进行验证。
(2)展示数据
在上一部分创建了100条数据的基础上,用ListView来展现这些数据。这需要修改Acticity的布局文件,并创建一个item布局文件,同时在Activity中查询数据。由于数据中只有name和 age两个文本,因此选择 SimpleAdapter 作为 ListView 的适配器。
在布局文件中加入一个ListView控件:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout 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">
- <ListView
- android:id="@+id/user_list"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
- </RelativeLayout>
为了能够展示出数据中的name和age两个字段,我们创建一个item:
- <?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">
- <TextView
- android:id="@+id/user_name"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:layout_gravity="center"
- android:textSize="20dp"/>
- <TextView
- android:id="@+id/user_age"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:gravity="center_vertical"
- android:textSize="20dp"/>
- </LinearLayout>
完成了这几个步骤之后,就可以在MainActivity中查询数据库并使用适配器展示到ListView中了。此时不再需要创建数据,不再使用之前创建数据的方法。代码修改如下:
- package com.rfstar.sqlitetest2;
- import androidx.appcompat.app.AppCompatActivity;
- import android.database.sqlite.SQLiteDatabase;
- import android.os.Bundle;
- import android.widget.ListView;
- import android.widget.SimpleAdapter;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- public class MainActivity extends AppCompatActivity {
- private ListView listView;
- private List<Map<String,Object>> mapList;
- private OpenHelper openHelper;
- private List<User>userList;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initData();
- initView();
- }
- private void initView()
- {
- listView=(ListView)findViewById(R.id.user_list);
- final SimpleAdapter simpleAdapter=new SimpleAdapter(
- this,mapList,R.layout.item,new String[]{"name","age"},
- new int[]{R.id.user_name,R.id.user_age});
- listView.setAdapter(simpleAdapter);
- }
- private void initData()
- {
- openHelper=new OpenHelper(this);
- SQLiteDatabase sqLiteDatabase=openHelper.getReadableDatabase();
- UserDao userDao=new UserDao(sqLiteDatabase);
- userList =userDao.queryAll();
- mapList=new ArrayList<>();
- for(User user:userList)
- {
- Map<String,Object> map=new HashMap<>();
- map.put("name",user.getName());
- map.put("age",user.getAge());
- mapList.add(map);
- }
- sqLiteDatabase.close();
- }
- }
运行程序,就会发现创建数据时添加的100条数据显示在界面上了,效果如下图所示:
文章评论(0条评论)
登录后参与讨论