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

QT读写Sqlite数据库三种方式 阅读详情

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

本文代码地址:UseSQLitDatabase

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

实现效果:

title=

1,界面分析

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

title=

主界面是一个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,比如查看学生信息,或者添加成功后返回主界面,涉及到Intent和startActivityForResult()等的使用。 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

布局效果:

title=

?
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

布局效果:

title=

?
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在使用中的一些常用步骤需要了解,懂得如何封装我们所需要的操作,当然,最好自己能够动手实践,这样才能找到自己不熟悉或者出错的地方,下面几篇文章或许对你有所帮助~。

Android轻量级数据库SQLite实战项目:学生管理系统开发全解析 该类的设计初衷在于解决原生SQLite API使用中的常见痛点:例如每次获取数据库连接时都需要判断是否存在、是否需要建表、版本是否匹配等问题。若由开发者手动处理这些逻辑,极易出现重复建表、版本错乱甚至数据库锁死的情况。通过懒加载机制(lazy initialization)自动处理这些细节,在首次请求数据库时触发创建或升级流程,从而保证数据库状态的一致性。其核心方法主要包括::当数据库第一次被创建时调用,通常在此方法中执行建表语句(DDL),如。 阅读详情

相关推荐

Android图书管理系统开发实战:从SQLite到RecyclerView的完整实现

Android应用开发中,数据持久化与列表展示是两大核心基础。本文从SQLite数据库原理出发,讲解如何利用Android Studio构建一个图书管理系统,涵盖数据库建表、增删改查、RecyclerView列表适配、借还书业务逻辑等关键环节。通过该项目,学习者可以打通界面搭建、数据存储与业务处理的完整链路,理解Gradle构建配置与项目结构。该系统适用于小型图书馆或课程设计场景,无需后端服务器,本地运行即可体验完整功能。本文结合工程实践,剖析开发中的常见问题与优化方案,帮助读者快速上手安卓项目开发。

weixin_34279246的博客 413

半期考试之 SQLite操作

半期考试 之 SQLite操作 要求: 三个EditView,分别输入信息; 点击下方“添加”按钮,将输入的信息写入SQLite数据库中去,添加成功后,下方listview进行数据的展示; 点击下方“修改”按钮,可修改选定的信息(EditView显示相关信息); 点击下方“删除”按钮,可删除选定的信息(listview进行同步的删除); xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

twenty_four_7的博客 1553

SARScape实战:集成GACOS数据优化InSAR大气校正全流程

本文详细介绍了如何在SARScape软件中集成GACOS数据,以优化InSAR大气校正的全流程。通过实战步骤,从GACOS数据申请、下载、导入,到在单景干涉图和SBAS-InSAR流程中应用,有效剥离大气相位延迟,显著提升形变监测结果的精度与可靠性,实现从“雾里看花”到“拨云见日”的转变。

weixin_28419039的博客 399

Android开发之sqlite数据库(小白)

sqlite

m0_46834909的博客 1502

智慧工地算法视频分析服务器区域入侵检测AI视频分析技术在煤矿的实战应用

通过实时分析和处理井下视频资料,智慧矿山算法视频分析服务器不仅能够及时发现并预警人员违规行为和设备异常状况,还能够通过智能分析预防潜在的安全风险,从而显著提高煤矿的安全管理水平和生产效率。

EasyDarwin开源社区技术博客 560

【ChangeCLIP】Remote sensing change detection with multimodal vision-language representation learning

ChangeCLIP论文及代码使用详解。持续更新变化检测最新论文,欢迎订阅本专栏。

向上生长的程序媛的博客 1337

Android EditView详解 常用的场景

EditView详解

奇奇怪怪的Android code的博客 1785

C# Blazor Server工业监控Web UI:实时数据推送、历史曲线、报警记录,跨浏览器访问(踩坑总结+生产可用)

坑点现象解决方案StateHasChanged()太频繁服务器CPU占用高,浏览器卡顿别100ms刷新一次,1秒刷新一次足够并发高时服务器卡多个用户同时访问,服务器响应慢用Redis做分布式缓存,或者加服务器做负载均衡断线重连后数据丢失浏览器刷新后,实时数据不更新用InfluxDB存历史数据,刷新后重新查询工业现场网络不稳定Blazor Server频繁断线用SQLite本地缓存,断网时数据不丢,联网后补发历史曲线查询慢查询过去7天的数据,要等很久。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 305

Android数据存储 如何搞定SQLite Database

在Android平台下有各种不同方法可以实现应用程序数据的存储和管理(SharedPerferences,File,SQLiteDatabase,网络存储),方法的选择依赖于需要存储的数据类型和数据结构。SQLite数据库能够安全而有效地解决结构化数据的存储问题; 这里主要介绍SQLite相关的用法,以及对数据库常见操作的封装。

CatTalk 4689

【OCPP】ocpp1.6协议3.3章节:功能配置文件及接口

Smart Charging Profile中定义了4个接口请求,即GetCompositeSchedule、ClearChargingProfile、SetChargingProfile和ClearCache等。Smart Charging: 包含智能充电相关的功能,如计划充电,报告充电计划,并改变充电速度。Core: 包含电动汽车充电相关的基础功能,如启动和停止充电,更改充电配置,报告充电状态等。Reservation: 包含预约服务相关的功能,如创建,取消和更改预约。

qq_53871375的博客 2170

delphi fmx android 自动更新(一)

所以,如果是http 则,manifest.xml application 下,https无需添加。增加android:usesCleartextTraffic="true",不然无法使用http下载东西。1,REQUEST_INSTALL_PACKAGES 权限。4,WRITE_EXTERNAL_STORAGE 权限。3,READ_EXTERNAL_STORAGE 权限。一般是从http下载安装包 apk。2,INTERNET 权限。sFile为apk包路径。

全粘工程师 550

android studio项目:数据存储和访问 建立SQLite数据库 实现增删查改

实验目的: 分别使用sqlite3工具和Android代码的方式建立SQLite数据库。在完成建立数据库的工作后,编程实现基本的数据库操作功能,包括数据的添加、删除和更新。 实验要求: 1.创建一个学生管理的应用,基本信息包含学生姓名,班级,学号。采用数据库存储这些信息。 2.应用应该至少包含信息录入和删除功能。 3.数据显示考虑采用ListView。 实验效果: 工程结构: 源代码: DBAdapter.java package com.example.shiyan6_sqlite; import

wow_awsl_qwq的博客 1万+

记录Android Studio连接华为(nova)手机鸿蒙系统踩过的坑

鸿蒙系统的华为老机子比较麻烦,坑有点多,兄弟们加油!

沉迷单车的追风少年 7922

android数据存储三

在andorid数据存储二中讲到了对SQLite数据库的增删查改也通过AndroidTestCase 进行了测试。在andorid数据存储三就来看看android自带对数据库操作增删查改的方法,利用这些方法可以更加方便的来操作表。同时也了解一下数据库的升级,有时候我们对软件的升级可能涉及到表的更改,有可能带来对表的操作。 SQLiteDatabase自带的对数据库增删查改的实例:

冯辉 419

uniapp - 实现PDA扫码枪RFID批量扫描读取示例代码,uni-app APP识别RFID(射频识别)结合硬件设备进行扫描,uniApp调用RFID读写通用方案适配各种设备+完整实例源码教程!

uni-app PDA 读取RFID,基于uniapp开发PDA扫码枪APP:实现RFID批量扫描读取功能,UniApp中的RFID实现,手持机 RFID插件(uni-app集成手持设备rfid插件),uniapp自动识别RFID,uni-app调RFID模块,uni-app RFID识别插件,uniapp读取rfid,uniapp手持设备扫描rfid,uniapp超高频rfid识别,rfid标签识别,uniapp调用RFID读写,uniapp rfid扫码枪,uniapp中如何使用rfid插件,打包上线后

🏆 前端领域优质创作者 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

一起Talk Android吧(第二百二十九回:Android中的数据存储之数据库四)

各位看官们大家好,上一回中咱们说的是Android中数据存储之数据库的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧! 看官们,我们在上一章回中介绍了如何在数据库中更新数据,这一回中我们将介绍如何在数据库中删除数据。删除数据需要使用SQLiteDatabase类的delete方法,其函数原型如下: public int delete (String table, String whereClause, String[] whereArgs) 第一个参数是数据库中

talk_8的专栏 172

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

一起Talk Android吧(第二百二十八回:Android中的数据存储之数据库三)

各位看官们大家好,上一回中咱们说的是Android中数据存储之数据库的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧! 看官们,我们在上一章回中介绍了如何在数据库中插入数据,这一回中我们将介绍如何在数据库中更新数据。更新数据需要使用SQLiteDatabase类的update方法,其函数原型如下: public int update (String table, ContentValues values, String whe

talk_8的专栏 167

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android数据存储之SQLite简单用法

Android数据存储之SQLite简单用法

无问西东 427

湖南科技大学Android开发重点复习指南

可以快速验证Android知识点的实现效果,其内置的模拟器免去了环境配置的麻烦,一键部署功能特别适合演示需要持续运行的Service和ContentProvider示例。我在复习时发现用它的实时预览功能调试布局参数非常高效,比纯理论学习更直观。SQLiteDatabase的query()/update()方法易混淆。AlertDialog必须通过Builder创建。所有XML属性都对应Java方法调用。熟练使用Adapter绑定列表数据。有序广播可按优先级拦截。

LapisLion88的博客 788

Android中使用嵌入式关系型SQLite数据库存储数据

除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。 在Android的平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varch...

weixin_33728708的博客 96

nwpu-cram之移动应用开发:Android项目实践完整指南

西北工业大学软件学院的nwpu-cram项目为学生们提供了丰富的学习资源,其中包含面向对象程序设计(Java)等核心课程资料,这些内容为Android移动应用开发奠定了坚实的基础。本文将为您详细介绍如何利用这些资源开展Android项目实践,从Java基础到移动应用开发的完整路径。 ## 📱 Android开发基础:Java编程核心 在nwpu-cram项目的[B面向对象](https://

gitblog_01059的博客 684

SQLiteDatabase和listView结合,数据库可更新,listview动态刷新,数据库存入数据输入的时间

SQLiteDatabase和listView结合,数据库可更新项目介绍 及 总体思路listview展示条目的刷新和监听 项目介绍 及 总体思路 项目功能是查询同学发量变化的数据,可以对数据库进行增加、删除。记录一下编写过程,同时也是学习过程。 对整个学校建立一个SQLiteDataBase,每个学生的发量变化数据对应个人的表,表名为同学的名字。需要完成的工作有: listview中展示同学名单 为listview设置监听,可跳转到学生详细数据页面 对数据库进行处理: 建立数据库,add按钮监听,生成

Cleo_Gao的博客 841

Android SQLite数据库增删改查操作

一、使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、 TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、 char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转...

weixin_30900589的博客 103

数据存储--SQLite增删改查

增 数据库的添加数据,SQLiteDatabase提供了一个insert()方法,专门用于添加数据。 contentValues.put("name","张三"); contentValues.put("age",18); contentValues.put("clazz","计算机1301班");

Hate Bugs 619
上一篇: Android中SQLite应用详解
下一篇: Android中运用OpenGL
混魔MJM
博客等级 码龄9年 57粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值