Android 数据存储 利用SQLiteDatabase实现简单的学生管理

这是作为上一篇Android 数据存储 如何搞定SQLite Database的实例练习,之所以单独列出来是因为除了数据库方面的知识,还涉及其它方面的知识,所以就写的详细点,啰嗦点。希望对初学者有所帮助。当然这个Demo比较简单,有很多可以改进的地方,但那不是这里探讨的重点,重点学习如何将SQLiteDatabase数据绑定到我们的界面!

本文代码地址:UseSQLitDatabase

我们要做一个简单的学生管理的demo,创建student.db,包括name,grade字段,实现增、删、改、查的功能;

实现效果:

Android 数据存储 利用SQLiteDatabase实现简单的学生管理

1,界面分析

我们先不忙着码代码,先来看看这样一个简单的Demo**基本的界面结构**:

Android 数据存储 利用SQLiteDatabase实现简单的学生管理

主界面是一个ListView用来显示学生信息,底部有两个Button,用来添加和查找学生信息; 点击**“添加”**Button,进入添加界面,输入姓名,分数,添加成功后返回主界面; 点击**“查找”**Button,弹出查找对话框,查找对话框此时包含一个EditView用来输入学生姓名和一个“查找”Button,当点击查找Button后,显示查找结果,如果查找结果为空,提示无此信息,如果不为空,点击结果可进入详细界面。 点击ListView Item可查看学生详细信息,在详细信息界面可对学生信息进行编辑修改和删除。

2,需要的的知识点:

自定义View的AlertDialog:因为我们的查找对话框需要我们自定义视图,不熟悉的请看Android常用实例—Alert Dialog的使用; 自定义Adapter的ListView:用来展示学生信息的ListView需要我们自定义Adapter将数据库中的数据填充到ListView。 Toast用来提示消息:这个比较简单,用来提示一些信息,包括添加成功、删除成功等,Android消息提示:AlertDialog、Toast、Notification的使用; Activity之间的信息传递:我们需要将学生信息从一个Activity传递到另一个Activity,比如查看学生信息,或者添加成功后返回主界面,涉及到IntentstartActivityForResult()等的使用。 SQLiteDatabase的基本使用:这也是我们这个练习的重点,不熟悉的建议先看上篇文章Android 数据存储 如何搞定SQLite Database;

3,具体实现

创建项目后,根据上一篇文章所说,我们按照以下步骤来完成我们的Demo:

1,界面布局

通过界面分析我们可以看出:MainActivity用来显示所有学生列表信息,其他界面提供查看或者编辑修改以及删除的功能,在界面布局上非常相似,所以我们将它们放到同一个布局里面,只不过根据具体的情况,设置个某些控件的Visibility属性为GONE或者VISIBLE;

主界面布局:res/layout/activity_main.xml,包含一个ListView和两个Button

?
1
2
3
4
5
6
7
8
<code class="hljs" xml="">    <relativelayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
    <listview android:pider="#5ABC4F" android:piderheight="1dp" android:id="@+id/stduent_list" android:layout_alignparenttop="true" android:layout_height="wrap_content" android:layout_width="match_parent">
 
    </listview>
    <linearlayout android:layout_alignparentbottom="true" android:layout_height="wrap_content" android:layout_marginleft="5dp" android:layout_marginright="5dp" android:layout_margintop="3dp" android:layout_width="match_parent" android:orientation="horizontal"><button android:background="#5ABC4F" android:gravity="center" android:id="@+id/btn_add" android:layout_height="45dp" android:layout_marginright="5dp" android:layout_weight="1" android:layout_width="0dp" android:text="添" android:textcolor="#ffffff" android:textsize="25sp"></button></linearlayout></relativelayout></code><button android:background="#5ABC4F" android:gravity="center" android:id="@+id/btn_search" android:layout_height="45dp" android:layout_marginleft="5dp" android:layout_weight="1" android:layout_width="0dp" android:text="查" android:textcolor="#ffffff" android:textsize="25sp"><code class="hljs" xml="">
 
     
    </code></button>

详细界面(增删改界面)布局:res/layout/student.xml,在布局文件里面我们先将**查找**Button的Visibility属性设置为GONE,即不可见(注意区分:INVISIBLE为不可见但占据布局位置,GONE不可见且不占据位置)。

?
1
2
3
4
5
6
7
8
<code class="hljs" xml="">    <!--?xml version=1.0 encoding=utf-8?-->
    <linearlayout android:gravity="center" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
    <imageview android:id="@+id/student_image" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@mipmap/boy">
    <edittext android:gravity="center" android:hint="输入姓名" android:id="@+id/student_name" android:layout_height="wrap_content" android:layout_margintop="20dp" android:layout_width="wrap_content" android:textcolor="#5ABC4F" android:textsize="20sp">
    <edittext android:gravity="center" android:hint="输入分数" android:id="@+id/student_grade" android:layout_height="wrap_content" android:layout_margintop="10dp" android:layout_width="wrap_content" android:textcolor="#5ABC4F" android:textsize="15sp"><button android:background="#5ABC4F" android:gravity="center" android:id="@+id/btn_change" android:layout_height="45dp" android:layout_margin="10dp" android:layout_width="match_parent" android:text="修" android:textcolor="#ffffff" android:textsize="25sp"></button><button android:background="#5ABC4F" android:gravity="center" android:id="@+id/btn_delete" android:layout_height="45dp" android:layout_margin="10dp" android:layout_width="match_parent" android:text="删" android:textcolor="#ffffff" android:textsize="25sp"></button></edittext></edittext></imageview></linearlayout></code><button android:background="#5ABC4F" android:gravity="center" android:id="@+id/btn_add_student" android:layout_height="45dp" android:layout_margin="10dp" android:layout_width="match_parent" android:text="添" android:textcolor="#ffffff" android:textsize="25sp" android:visibility="gone"><code class="hljs" xml="">
 
 
    </code></button>

ListView Item布局:,用来显示学生头像,姓名和分数,res/layout/list_item.xml

布局效果:

Android 数据存储 利用SQLiteDatabase实现简单的学生管理

?
1
2
3
4
5
6
7
8
<code class="hljs" xml="">    <!--?xml version=1.0 encoding=utf-8?-->
    <relativelayout android:layout_height="wrap_content" android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android">
    <imageview android:id="@+id/image" android:layout_alignparentleft="true" android:layout_height="80dp" android:layout_width="80dp" android:padding="4dp" android:src="@mipmap/boy">
    <textview android:id="@+id/name" android:layout_height="wrap_content" android:layout_marginleft="10dp" android:layout_margintop="10dp" android:layout_torightof="@+id/image" android:layout_width="match_parent" android:text="姓名" android:textcolor="#5ABC4F" android:textsize="20sp">
    <textview android:id="@+id/grade" android:layout_below="@+id/name" android:layout_height="wrap_content" android:layout_marginleft="10dp" android:layout_margintop="8dp" android:layout_torightof="@+id/image" android:layout_width="match_parent" android:text="分数" android:textcolor="#5ABC4F" android:textsize="15sp">
 
 
    </textview></textview></imageview></relativelayout></code>

查找对话框布局:我们还需要为查找对话框做一个布局,res/layout/dialog_search.xml,注意,刚开始搜索时,只显示EditView用来输入学生姓名,显示搜索结果时EditView不可见而显示一个ListView,所以布局中先将ListView的Visibility属性为GONE

布局效果:

Android 数据存储 利用SQLiteDatabase实现简单的学生管理

?
1
2
3
4
5
6
7
8
9
<code class="hljs" xml="">    <!--?xml version=1.0 encoding=utf-8?-->
    <linearlayout android:gravity="center" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
 
    <edittext android:gravity="center" android:hint="学生姓名" android:id="@+id/search_name" android:layout_height="50dp" android:layout_margin="10dp" android:layout_width="wrap_content" android:textcolor="#5ABC4F" android:textsize="20sp">
    <listview android:id="@+id/search_result" android:layout_height="wrap_content" android:layout_width="match_parent" android:visibility="gone">
    </listview>
    </edittext></linearlayout></code><button android:background="#5ABC4F" android:gravity="center" android:id="@+id/btn_search_dialog" android:layout_height="45dp" android:layout_margin="10dp" android:layout_width="match_parent" android:text="查" android:textcolor="#ffffff" android:textsize="25sp"><code class="hljs" xml="">
 
    </code></button>
2,创建Student类:首先需要为我们存储的数据建立一个Model类,便于在使用中获取字段和对象。

Student.java:为其提供构造函数和setget方法;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<code class="hljs" java="">public class Student implements Serializable{
    private int id;
    private String name;
    private String grade;
 
    public Student(){}
    public Student(int id, String name, String grade) {
        this.id = id;
        this.name = name;
        this.grade = grade;
    }
 
    public Student(String name, String grade) {
        this.name = name;
        this.grade = grade;
    }
 
    public int getId() {
        return id;
    }
 
    public String getName() {
        return name;
    }
 
    public String getGrade() {
        return grade;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setGrade(String grade) {
        this.grade = grade;
    }
    }</code>
3,创建DatabaseHandler类:用来封装我们的数据库操作

DatabaseHandler.java:编写构造函数,覆写onCreate(),onUpgrade()方法,以及提供增删改查student的方法:

addStudent(Student student);添加student getStudent(String name),通过name获取student getAllStudent();获取所有的student getStudentCounts();获取student数目 updateStudent(Student student);更新student deleteStudent(Student student);删除student
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<code class="hljs" java="">public class DatabaseHandler extends SQLiteOpenHelper {
 
    private static final String DATABASE_NAME=Test;
    private static final String TABLE_NAME=student;
    private static final int VERSION=1;
    private static final String KEY_ID=id;
    private static final String KEY_NAME=name;
    private static final String KEY_GRADE=grade;
 
    //建表语句
    private static final String CREATE_TABLE=create table +TABLE_NAME+(+KEY_ID+
             integer primary key autoincrement,+KEY_NAME+ text not null,+
            KEY_GRADE+ text not null);;
    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
    }
 
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_TABLE);
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL(DROP TABLE IF EXISTS  + TABLE_NAME);
        onCreate(sqLiteDatabase);
    }
 
    public void addStudent(Student student){
        SQLiteDatabase db=this.getWritableDatabase();
 
        //使用ContentValues添加数据
        ContentValues values=new ContentValues();
        values.put(KEY_NAME,student.getName());
        values.put(KEY_GRADE,student.getGrade());
        db.insert(TABLE_NAME, null, values);
        db.close();
    }
    public Student getStudent(String name){
        SQLiteDatabase db=this.getWritableDatabase();
 
        //Cursor对象返回查询结果
        Cursor cursor=db.query(TABLE_NAME,new String[]{KEY_ID,KEY_NAME,KEY_GRADE},
                KEY_NAME+=?,new String[]{name},null,null,null,null);
 
 
        Student student=null;
        //注意返回结果有可能为空
        if(cursor.moveToFirst()){
            student=new Student(cursor.getInt(0),cursor.getString(1), cursor.getString(2));
        }
        return student;
    }
    public int getStudentCounts(){
        String selectQuery=SELECT * FROM +TABLE_NAME;
        SQLiteDatabase db=this.getReadableDatabase();
        Cursor cursor=db.rawQuery(selectQuery,null);
        cursor.close();
 
        return cursor.getCount();
    }
 
    //查找所有student
    public List<student> getALllStudent(){
        List<student> studentList=new ArrayList<student>();
 
        String selectQuery=SELECT * FROM +TABLE_NAME;
        SQLiteDatabase db=this.getReadableDatabase();
        Cursor cursor=db.rawQuery(selectQuery,null);
        if(cursor.moveToFirst()){
            do{
                Student student=new Student();
                student.setId(Integer.parseInt(cursor.getString(0)));
                student.setName(cursor.getString(1));
                student.setGrade(cursor.getString(2));
                studentList.add(student);
            }while(cursor.moveToNext());
        }
        return studentList;
    }
 
    //更新student
    public int updateStudent(Student student){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put(KEY_NAME,student.getName());
        values.put(KEY_GRADE,student.getGrade());
 
        return db.update(TABLE_NAME,values,KEY_ID+=?,new String[]{String.valueOf(student.getId())});
    }
    public void deleteStudent(Student student){
        SQLiteDatabase db=this.getWritableDatabase();
        db.delete(TABLE_NAME,KEY_ID+=?,new String[]{String.valueOf(student.getId())});
        db.close();
    }
}</student></student></student></code>
4,自定义Adapter:StudentAdapter:ListView需要自定义Adapter来显示视图,自定义Adapter扩展自BaseAdapter,覆写其中四个方法即可,其中getView()方法用来控制没个ListView item的具体显示。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<code class="hljs" java="">public class StudentAdapter extends BaseAdapter {
    private List<student> students;
    private Context context;
    public StudentAdapter(Context context,List<student> students) {
        super();
        this.students=students;
        this.context=context;
    }
 
    @Override
    public int getCount() {
        return students.size();
    }
 
    @Override
    public Object getItem(int i) {
        return students.get(i);
    }
 
    @Override
    public long getItemId(int i) {
        return i;
    }
 
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        if(view==null){
            view= LayoutInflater.from(context).inflate(R.layout.list_item,viewGroup,false);
        }
        ImageView imageView= (ImageView) view.findViewById(R.id.image);
        TextView tvName= (TextView) view.findViewById(R.id.name);
        TextView tvGrade= (TextView) view.findViewById(R.id.grade);
 
        //随机为学生匹配头像
        if(students.get(i).getId()%2==0)
        {
            imageView.setImageResource(R.mipmap.girl1);
        }else{
            imageView.setImageResource(R.mipmap.boy2);
        }
        tvName.setText(姓名  +students.get(i).getName());
        tvGrade.setText(分数  +students.get(i).getGrade());
        return view;
    }
    }</student></student></code>
5,完成MainActivity:在这里要注意startActivityForResult()的使用,和为自定义View的AlertDialog添加事件监听。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<code class="hljs" java="">public class MainActivity extends Activity implements View.OnClickListener{
 
    private ListView students;
    private StudentAdapter adapter;
    private Button btnAdd,btnSearch;
    private DatabaseHandler dbHandler;
    private List<student> studentList;
    private SQLiteDatabase db;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        students= (ListView) findViewById(R.id.stduent_list);
        btnAdd= (Button) findViewById(R.id.btn_add);
        btnSearch= (Button) findViewById(R.id.btn_search);
 
 
        btnSearch.setOnClickListener(this);
        btnAdd.setOnClickListener(this);
 
        dbHandler=new DatabaseHandler(this);
 
        //获取全部学生信息
        studentList=dbHandler.getALllStudent();
        adapter=new StudentAdapter(this,studentList);
        students.setAdapter(adapter);
 
        //点击ListView item跳转到详细界面
        students.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<!--?--> adapterView, View view, int i, long l) {
                Intent intent=new Intent(MainActivity.this,StudentActivity.class);
 
                //注意这里的request是为了区分是通过什么跳转到详细界面的
                intent.putExtra(request,Look);
                intent.putExtra(id,studentList.get(i).getId());
                intent.putExtra(name,studentList.get(i).getName());
                intent.putExtra(grade,studentList.get(i).getGrade());
                //
                startActivityForResult(intent, 0);
            }
        });
    }
 
 
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_add:
                Intent i=new Intent(MainActivity.this,StudentActivity.class);
 
                i.putExtra(request,Add);
                startActivityForResult(i, 1);
                break;
            case R.id.btn_search:
                AlertDialog.Builder builder=new AlertDialog.Builder(this);
 
                //自定义View的Dialog
                final LinearLayout searchView= (LinearLayout) getLayoutInflater().inflate(R.layout.dialog_search,null);
                builder.setView(searchView);
                final AlertDialog dialog=builder.create();
                dialog.show();
 
                //为自定义View的Dialog的控件添加事件监听。
                final EditText searchName= (EditText) searchView.findViewById(R.id.search_name);
                Button btnDialogSearch= (Button) searchView.findViewById(R.id.btn_search_dialog);
                btnDialogSearch.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        searchName.setVisibility(View.GONE);
                        ListView list = (ListView) searchView.findViewById(R.id.search_result);
                        List<student> resultList = new ArrayList<student>();
                        final Student searchStudent = dbHandler.getStudent(searchName.getText().toString());
                        if (searchStudent != null) {
                            resultList.add(searchStudent);
                            StudentAdapter resultAdapter = new StudentAdapter(getApplicationContext(), resultList);
                            list.setAdapter(resultAdapter);
                            list.setVisibility(View.VISIBLE);
                            list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                @Override
                                public void onItemClick(AdapterView<!--?--> adapterView, View view, int i, long l) {
                                    dialog.dismiss();
                                    Intent intent = new Intent(MainActivity.this, StudentActivity.class);
                                    intent.putExtra(request, Look);
                                    intent.putExtra(id, searchStudent.getId());
                                    intent.putExtra(name, searchStudent.getName());
                                    intent.putExtra(grade, searchStudent.getGrade());
                                    startActivityForResult(intent, 0);
                                }
                            });
                        } else {
                            //关闭Dialog
                            dialog.dismiss();
                            Toast.makeText(getApplicationContext(), 无此学生, Toast.LENGTH_SHORT).show();
                        }
 
                    }
                });
                break;
        }
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 
        //根据返回的resultCode判断是通过哪种操作返回的,并提示相关信息;
        switch (requestCode){
            case 0:
                if (resultCode==2)
                    Toast.makeText(this,修改成功,Toast.LENGTH_SHORT).show();
                if (resultCode==3)
                    Toast.makeText(this,已删除,Toast.LENGTH_SHORT).show();
                break;
            case 1:
                if (resultCode==RESULT_OK)
                    Toast.makeText(this,添加成功,Toast.LENGTH_SHORT).show();
                break;
        }
        /**
         * 如果这里仅仅使用adapter.notifyDataSetChanged()是不会刷新界面ListView的,
         * 因为此时adapter中传入的studentList并没有给刷新,即adapter也没有被刷新,所以你可以
         * 重新获取studentList后再改变adapter,我这里通过调用onCreate()重新刷新了整个界面
         */
 
    //        studentList=dbHandler.getALllStudent();
    //        adapter=new StudentAdapter(this,studentList);
    //        students.setAdapter(adapter);
        onCreate(null);
    }
    }</student></student></student></code>
6,创建StudentActivity:用来展示详细信息和修改,删除。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<code class="hljs" java="">public class StudentActivity extends Activity implements View.OnClickListener{
 
    private EditText etName,etGrade;
    private ImageView imageView;
    private Button btnChange,btnDelete,btnAdd;
    private int id;
    private DatabaseHandler handler;
    private Intent intent;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.student);
 
        etName= (EditText) findViewById(R.id.student_name);
        etGrade= (EditText) findViewById(R.id.student_grade);
        btnChange= (Button) findViewById(R.id.btn_change);
        btnDelete= (Button) findViewById(R.id.btn_delete);
        btnAdd= (Button) findViewById(R.id.btn_add_student);
        imageView= (ImageView) findViewById(R.id.student_image);
 
        handler=new DatabaseHandler(this);
        //获取传递过来的intent
        intent=getIntent();
 
        //通过request判断,是通过那个Button点击进入的,之后隐藏或者显示相应的Button
        String request=intent.getStringExtra(request);
        switch (request){
            //点击添加按钮进入的,则只显示btnAdd
            case Add:
                btnChange.setVisibility(View.GONE);
                btnDelete.setVisibility(View.GONE);
                btnAdd.setVisibility(View.VISIBLE);
                break;
            //通过ListView Item进入的
            case Look:
                id=intent.getExtras().getInt(id);
                etName.setText(intent.getStringExtra(name));
                etGrade.setText(intent.getStringExtra(grade));
 
                //随机设定头像
                if(id%2==0)
                {
                    imageView.setImageResource(R.mipmap.girl1);
                }else{
                    imageView.setImageResource(R.mipmap.boy2);
                }
                break;
        }
        btnAdd.setOnClickListener(this);
        btnChange.setOnClickListener(this);
        btnDelete.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_add_student:
                Student newStudent=new Student(id,etName.getText().toString(),etGrade.getText().toString());
                handler.addStudent(newStudent);
                setResult(RESULT_OK, intent);
                finish();
                break;
            case R.id.btn_change:
                Student student=new Student(id,etName.getText().toString(),etGrade.getText().toString());
                handler.updateStudent(student);
                //这里设置resultCode是为了区分是修改后返回主界面的还是删除后返回主界面的。
                setResult(2,intent);
                finish();
                break;
            case R.id.btn_delete:
                Student s=new Student(id,etName.getText().toString(),etGrade.getText().toString());
                handler.deleteStudent(s);
                setResult(3, intent);
                finish();
                break;
        }
    }
    }</code>
7,Manifest.xml:记得将StudentActivity添加进Manifest.xml
?
1
<code class="hljs" xml="">    </activity></code>

总结:

事实上,如果你对startActivityForResult()方法和Intent在Activity之间传递值等比较熟悉的话,这个Demo显得很简单,另外我们还用到了如何使用自定义View的ALertDialog和自定义View的ListView。还有一种比较常用的方法就是使用CursorAdapter来直接将数据库数据填充到ListView上,可以参考下面的文章。最后,对SQLiteDatabase在使用中的一些常用步骤需要了解,懂得如何封装我们所需要的操作,当然,最好自己能够动手实践,这样才能找到自己不熟悉或者出错的地方,下面几篇文章或许对你有所帮助~。