在上一篇博客中介绍了在android中使用SQLite数据库,上一篇博客中是直接使用sql语句操作sqlite数据库,这样会带来一个非常大的问题,万一sql语句书写错误,编译时程序并不会报错,在运行时发现错误时,又重新回来修改代码,这样会大大降低开发效率,为了解决这个问题Android中封装了一些可以直接操作sqlite的API,并不需要写sql语句
接下来通过一个实例介绍使用Android中封装好的API操作sqlite数据库,实例中实现的效果和上一篇博客在android中使用SQLite数据库中实现的效果一样,只是将实现方式由使用sql语句实现改成了使用API,只有一个地方不同,就是点击Select按钮后会显示数据库中的所有的学生的信息,演示效果如下
实现方式,使用Android Studio创建一个Android 工程
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.fyt.databasedemo1.MainActivity" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="createDatabase" android:textSize="30dp" android:onClick="createDatabase"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Insert" android:textSize="30dp" android:onClick="Insert"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Delete" android:textSize="30dp" android:onClick="Delete"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Update" android:textSize="30dp" android:onClick="Update"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Select" android:textSize="30dp" android:onClick="Select"/> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <ScrollView 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"> <LinearLayout android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> </LinearLayout> </ScrollView>
3、新建一个Student类用于处理学生信息
package com.fyt.databasedemo1; import android.util.Log; //创建一个学生类 public class Student { //学生的姓名 private String Name; //学生的年龄 private int Age; //学生的学号 private int No; //学生的C++成绩 private float Cpp; //学生的数学成绩 private float Math; //学生的英语成绩 private float English; //无参构造方法 public Student() { } //带参数的构造方法 public Student(String name,int age,int no,float cpp,float math,float english) { Name = name; Age = age; No = no; Cpp = cpp; Math = math; English = english; } public String getName() { return Name; } public void setName(String name) { Name = name; } public int getAge() { return Age; } public void setAge(int age) { Age = age; } public int getNo() { return No; } public void setNo(int no) { No = no; } public float getCpp() { return Cpp; } public void setCpp(float cpp) { Cpp = cpp; } public float getMath() { return Math; } public void setMath(float math) { Math = math; } public float getEnglish() { return English; } public void setEnglish(float english) { English = english; } @Override public String toString() { String str = getName() + "," + getAge() + "," + getNo() + "," + getCpp() + "," + getMath() + "," + getEnglish(); return str; } }
package com.fyt.databasedemo1; import android.content.Context; import android.database.sqlite.sqliteDatabase; import android.database.sqlite.sqliteOpenHelper; import android.util.Log; //创建一个抽象类sqliteOpenHelper的实现类MyOpenHelper public class MyOpenHelper extends sqliteOpenHelper { /** * MyOpenHelper构造方法 * @param context 上下文 * @param name 数据库文件的名字 * @param factory 游标工厂(结果集) * @param version 数据库的版本号(用于升级) */ public MyOpenHelper(Context context,String name,sqliteDatabase.CursorFactory factory,int version) { super(context,name,factory,version); } //创建数据库时,调用此方法 @Override public void onCreate(sqliteDatabase db) { Log.d("MainActivity","数据库创建成功"); //创建一个学生表 db.execsql("create table student(_id integer primary key autoincrement,name char(10),age integer,no integer,cpp float,math float,english float)"); } //数据库升级时调用此方法 @Override public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) { Log.d("MainActivity","数据库升级成功"); } }
5、修改MainActivity.java中的代码
package com.fyt.databasedemo1; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.database.sqlite.sqliteDatabase; import android.os.Bundle; import android.view.View; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { //用于创建帮助器对象 private MyOpenHelper oh; //用于创建数据库对象 private sqliteDatabase db; List<Student> studentsList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建集合,用来保存学生的信息 studentsList = new ArrayList<Student>(); //创建学生对象 Student st1 = new Student("刘得意",19,1001,60,98,75); Student st2 = new Student("王锐",20,1002,63,90,96); Student st3 = new Student("何煜中",1003,73,82); Student st4 = new Student("王磊",21,1004,87,86,92); Student st5 = new Student("冯松",1005,89,83); Student st6 = new Student("裴培",1006,75,82,91); Student st7 = new Student("马骁",1007,62,67,90); Student st8 = new Student("马婧",1008,84,87); Student st9 = new Student("周俊升",1009,57,68,96); Student st10 = new Student("贺祺",1010,61,96,72); //将学生的信息添加到集合中 studentsList.add(st1); studentsList.add(st2); studentsList.add(st3); studentsList.add(st4); studentsList.add(st5); studentsList.add(st6); studentsList.add(st7); studentsList.add(st8); studentsList.add(st9); studentsList.add(st10); } //创建数据库 public void createDatabase(View view) { //创建帮助器对象 oh = new MyOpenHelper(this,"people.db",null,1); //创建数据库对象 db = oh.getWritableDatabase(); } //向数据库中添加数据 public void Insert(View view) { //使用增强for遍历集合中的学生的信息 for(Student student : studentsList) { //将需要插入的数据 ContentValues values = new ContentValues(); values.put("name",student.getName()); values.put("age",student.getAge()); values.put("no",student.getNo()); values.put("cpp",student.getCpp()); values.put("math",student.getMath()); values.put("english",student.getEnglish()); db.insert("student",values); } } //删除数据库中的数据 public void Delete(View view) { //删除姓名为"刘得意"的学生的信息 db.delete("student","name = ?",new String[]{"刘得意"}); } //修改数据库中的数据 public void Update(View view) { //将数据库中所有人的学号减少1 db.execsql("update student set no = no - 1"); } //查询数据库中的数据 public void Select(View view) { //关闭数据库 db.close(); Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivity(intent); } }
6、新建一个SecondActivity.java文件,用于实现第二个界面的逻辑
package com.fyt.databasedemo1; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.sqliteDatabase; import android.os.Bundle; import android.util.Log; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class SecondActivity extends Activity { private MyOpenHelper oh; private sqliteDatabase db; private List<Student> studentList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //加载布局文件 setContentView(R.layout.activity_second); //创建集合,保存学生的信息 studentList = new ArrayList<Student>(); //创建数据库 createDatabase(); //从数据库中读取数据 readDataFromDatabase(); //显示学生的信息 showStudentData(); } //创建数据库 public void createDatabase() { //创建帮助器对象 oh = new MyOpenHelper(this,1); //创建数据库对象 db = oh.getWritableDatabase(); } //从数据库中读取数据 public void readDataFromDatabase() { Cursor cursor = db.query("student",null); while(cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); int no = cursor.getInt(cursor.getColumnIndex("no")); float cpp = cursor.getFloat(cursor.getColumnIndex("cpp")); float math = cursor.getFloat(cursor.getColumnIndex("math")); float english = cursor.getFloat(cursor.getColumnIndex("english")); Log.d("MainActivity",name + "," + age + "," + no + "," + cpp + "," + math + "," + english); //将学生的信息添加到集合中 Student student = new Student(name,age,no,cpp,math,english); studentList.add(student); } } //显示学生的信息 public void showStudentData() { //获得布局文件上的线性布局 LinearLayout ll = (LinearLayout) findViewById(R.id.ll); //把数据显示至屏幕 for (Student student : studentList) { //1.集合中每有一条元素,就new一个textView TextView tv = new TextView(this); //2.把人物的信息设置为文本框的内容 tv.setText(student.toString()); //设置字体的大小为18 tv.setTextSize(18); //把textView设置为线性布局的子节点 ll.addView(tv); } } }
最后将SecondActivity这个活动添加到配置文件中的Application下面
<activity android:name=".SecondActivity"> </activity>