每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库—SQLite。SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要几百K的内存就够了。SQLite已经被多种软件和产品使用,Mozilla FireFox就是使用SQLite来存储配置数据的,Android和iPhone都是使用SQLite来存储数据的。
SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征:
1、轻量级
SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。
2、独立性
SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻烦。
3、隔离性
SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。
4、跨平台
SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、Windows Mobile、Symbian、Palm等。
5、多语言接口
SQLite数据库支持很多语言编程接口,比如C/C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。
6、安全性
SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。
下面介绍一下如何在Android平台创建SQLite数据库,方法很简单,我们需要继承这个接口类SQLiteOpenHelper,并实现其中的onCreate与onUpgrade方法:
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String db_name = "SQLite_db.db";//数据文件的名字 private static int NUMBER = 1;//当前数据库版本,用于升级 private static final String table_name = "students";//表名 private static String sql = null;//sql语句 public MyDatabaseHelper(Context context) { super(context, db_name, null, NUMBER);//数据库文件保存在当前应用所在包名:<包>/database/ } @Override public void onCreate(SQLiteDatabase db) { sql = "CREATE TABLE " + table_name + " (" + "id INTEGER PRIMARY KEY ," + "name VARCHAR(50) NOT NULL)";//创建数据库的SQL语句 db.execSQL(sql);//执行SQL语句 } /** * 当数据库进行升级是调用,这里通过NUMBER值来进行判断,数据库是否升级 */ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //第一种写法 sql = "ALTER TABLE " + table_name + " ADD sex VARCHAR(2) NULL"; Log.i("sql", sql); db.execSQL(sql); //第二种写法 //db.execSQL("ALTER TABLE students ADD sex VARCHAR(10) NULL"); } }
下面我们在主Activity中创建这个类,然后进行数据的生成:
public class Activityone extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_one); //创建SqlLite数据库 SQLiteOpenHelper helper = new MyDatabaseHelper(this); helper.getWritableDatabase(); } }
到这里我们关于SQLite的创建就为大家分享完毕,需要提示的就是onUpgrade()方法,这个方法一般不执行,当我们的数据库版本发生变化时,才会被执行。
下面我们来一起学习一下如何在Android中来使用SQLite数据库,来完成对数据的增、删、改、查、统计。
我们通过创建一个管理学生信息的数据库来完成对SQLite功能的介绍展示,首先为了方便对学生类进行管理,我们先创建一个学生类:
public class tab_students { public Integer id;//学生Id public String name;//学生姓名 public String password;//学生密码 public String school;//学生学校 public tab_students(){ } public tab_students(int _id,String _name,String _password){ id=_id; name=_name; password=_password; } public Integer getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String _name) { name = _name; } public String getPassword() { return password; } public void setPassword(String _password) { password = _password; } public String getSchool() { return school; } public void setSchool(String _school) { school = _school; } @Override public String toString() { return "id:"+this.getId()+" name:"+this.getName()+" password:"+this.getPassword(); } }
有了学生类,下面我们创建数据库配置文件:
public class MyTabOpen extends SQLiteOpenHelper{ private static final String db_sql = "SQLiter.db"; private static int NUMBER = 1; private static final String tab_name = "students"; private static String sql = null; public MyTabOpen(Context context) { super(context, db_sql, null, NUMBER); } @Override public void onCreate(SQLiteDatabase db) { sql = "CREATE TABLE " + tab_name + " (" + "id INTEGER PRIMARY KEY ," + "name VARCHAR(20) NOT NULL ," + "password VARCHAR(20) NOT NULL)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //在更新数据库时,因原先数据库表中已有数据,所以新增加的列属性只能设置为“可以为空” db.execSQL("ALTER TABLE students ADD school VARCHAR(10) NULL"); } }
对于这个文件,大家有什么疑问请看上面的SQLite数据库创建讲解。
这里我们的主Activity的代码如下,对于主Activity的布局文件,就不在粘代码了,布局文件全是Button按钮:
public class Activityone extends Activity { private static tab_students stu = null; private static tab_service ser = null; private static int conn = 1; private TextView mytext = null; private Button mybutton1 = null;//添加数据 private Button mybutton2 = null;//删除数据 private Button mybutton3 = null;//修改数据 private Button mybutton4 = null;//查询数据 private Button mybutton5 = null;//分页获取数据 private Button mybutton6 = null;//获取数据总数 private Button mybutton7 = null;//普通页面跳转 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_one); mytext = (TextView)findViewById(R.id.textview); mytext.setText("增删改查序"+"("+"sql语句"+")"); mybutton1 = (Button)findViewById(R.id.button1); mybutton2 = (Button)findViewById(R.id.button2); mybutton3 = (Button)findViewById(R.id.button3); mybutton4 = (Button)findViewById(R.id.button4); mybutton5 = (Button)findViewById(R.id.button5); mybutton6 = (Button)findViewById(R.id.button6); mybutton7 = (Button)findViewById(R.id.button7); mybutton1.setOnClickListener(new mybuttonlistener()); mybutton2.setOnClickListener(new mybuttonlistener()); mybutton3.setOnClickListener(new mybuttonlistener()); mybutton4.setOnClickListener(new mybuttonlistener()); mybutton5.setOnClickListener(new mybuttonlistener()); mybutton6.setOnClickListener(new mybuttonlistener()); mybutton7.setOnClickListener(new mybuttonlistener()); } class mybuttonlistener implements OnClickListener{ @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1://添加数据 ser =new tab_service(getApplicationContext()); stu = new tab_students(conn++,"小米","abc123"); ser.save(stu); break; case R.id.button2://删除数据 ser =new tab_service(getApplicationContext()); ser.del(1); break; case R.id.button3://修改数据 ser =new tab_service(getApplicationContext()); stu = new tab_students(1,"HTC","acm123"); ser.update(stu); break; case R.id.button4://查询数据 ser =new tab_service(getApplicationContext()); stu=ser.find(1); System.out.println(stu.toString()); break; case R.id.button5://分页获取数据 ser =new tab_service(getApplicationContext()); List<tab_students> list = ser.getScrollDate(0,5); for(tab_students stu : list){ System.out.println(stu.toString()); } break; case R.id.button6://获取数据总数 long number = 0; ser =new tab_service(getApplicationContext()); number=ser.gettab(); System.out.println("数据库中共有:"+number+"条记录."); break; default: Activityone.this.startActivity(new Intent(Activityone.this,Activitytwo.class));//普通跳转 break; } } } }
大家可能已经看到了,这里我们对SQLite的操作,都是通过tab_service.java类完成了,下面就为大家揭晓如何对SQLite进行操作:
public class tab_service { private MyTabOpen mytabopen = null; private static SQLiteDatabase db = null; private static String sql = null; private static final String tab_name = "students"; public tab_service(Context context) { this.mytabopen = new MyTabOpen(context);//获得数据库操作实例 } //添加数据 public void save(tab_students students){ db = mytabopen.getWritableDatabase(); sql = "insert into "+tab_name+"(id,name,password) values(?,?,?)"; db.execSQL(sql, new Object[]{students.getId(),students.getName(),students.getPassword()}); db.close(); //为了提高性能sqliter数据库可以不关闭 } //删除数据 public void del(Integer id){ db = mytabopen.getWritableDatabase(); sql = "delete from "+tab_name+" where id = ?"; db.execSQL(sql, new Object[]{id}); db.close(); } //更新数据 public void update(tab_students students){ db = mytabopen.getWritableDatabase(); sql = "update "+tab_name+" set name=?,password=? where id=?"; db.execSQL(sql, new Object[]{students.getName(), students.getPassword(), students.getId()}); db.close(); } //查询数据 public tab_students find(Integer id){ //getReadableDatabase()与getWritableDatabase()通过查看源代码知道,getReadableDatabase()方法在磁盘空间满的时候,仍能返回数据库操作实例,不过此时的实例只能用于读不能写 db = mytabopen.getReadableDatabase(); sql = "select * from "+tab_name+ " where id=?"; Cursor cur = db.rawQuery(sql, new String[]{id.toString()}); if(cur.moveToFirst()){ String name = cur.getString(cur.getColumnIndex("name")); String password = cur.getString(cur.getColumnIndex("password")); return new tab_students(id,name,password); } cur.close(); db.close(); return null; } //分页获取数据 public List<tab_students> getScrollDate(int again,int last){ List<tab_students> list = new ArrayList<tab_students>(); db = mytabopen.getReadableDatabase(); sql = "select * from "+tab_name+ "limit ?,? order by id asc";//根据查询结果的id对数据进行升序排列 //sql = "select * from " +tab_name+ " limit ?,?"; Cursor cur = db.rawQuery(sql, new String[]{String.valueOf(again), String.valueOf(last)}); while (cur.moveToNext()) { int id = cur.getInt(cur.getColumnIndex("id")); String name = cur.getString(cur.getColumnIndex("name")); String password = cur.getString(cur.getColumnIndex("password")); tab_students stu = new tab_students(id, name, password); list.add(stu); } cur.close(); db.close(); return list; } //获取数据总数目 public long gettab(){ db = mytabopen.getReadableDatabase(); sql = "select count(*) from "+tab_name; Cursor cur = db.rawQuery(sql, null); cur.moveToFirst(); long result = cur.getLong(0); return result; } }
是不是感觉和我们的SQL数据库操作一样,sql语句没有什么区别,是的,他们完全一致。没学过数据库的小朋友是不是已经抓狂啦,不要担心,Android工程师想到了你们,Android为我们封装好了一套对SQLite数据库进行操作的规范,下面我们就一起来学习一下,如何通过Android提供的规范晚场上面的操作。
这里我们只需要修改一下,我们上面对数据库操作的类:
public class tab_service_two { private MyTabOpen mytabopen = null; private static SQLiteDatabase db = null; private static final String tab_name = "students"; public tab_service_two(Context context) { this.mytabopen = new MyTabOpen(context);//获得数据库操作实例 } //添加数据 public void save(tab_students students){ db = mytabopen.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("id", students.getId()); values.put("name", students.getName()); values.put("password", students.getPassword()); db.insert(tab_name, null, values); db.close(); } //删除数据 public void del(Integer id){ db = mytabopen.getWritableDatabase(); db.delete(tab_name, "id=?", new String[]{id.toString()}); db.close(); } //修改数据 public void update(tab_students students){ db = mytabopen.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", students.getName()); values.put("password", students.getPassword()); db.update(tab_name, values, "id=?", new String[]{students.getId().toString()}); db.close(); } //查询数据 public tab_students find(Integer id){ //getReadableDatabase()与getWritableDatabase()通过查看源代码知道,getReadableDatabase()方法在磁盘空间满的时候,仍能返回数据库操作实例,不过此时的实例只能用于读不能写 db = mytabopen.getReadableDatabase(); //当要查询数据库表中的所以信息时,第二个参数可以使用设置为空来代替数组 Cursor cur = db.query(tab_name, new String[]{"name","password"}, "id=?", new String[]{id.toString()}, null, null, null); if(cur.moveToFirst()){ String name = cur.getString(cur.getColumnIndex("name")); String password = cur.getString(cur.getColumnIndex("password")); return new tab_students(id,name,password); } cur.close(); db.close(); return null; } //分页获取数据 public List<tab_students> getScrollDate(int again,int last){ List<tab_students> list = new ArrayList<tab_students>(); db = mytabopen.getReadableDatabase(); Cursor cur = db.query(tab_name, null, null, null, null, null, "id asc", again+","+last); while (cur.moveToNext()) { int id = cur.getInt(cur.getColumnIndex("id")); String name = cur.getString(cur.getColumnIndex("name")); String password = cur.getString(cur.getColumnIndex("password")); tab_students stu = new tab_students(id, name, password); list.add(stu); } cur.close(); db.close(); return list; } //获取数据总数 public long gettab(){ db = mytabopen.getReadableDatabase(); Cursor cur = db.query(tab_name, new String[]{"count(*)"}, null, null, null, null, null); cur.moveToFirst(); long result = cur.getLong(0); return result; } }
好了关于SQLite在Android平台的使用,就为大家介绍完毕,内容很简单,没有太大的难度,相信小伙伴一定能理解。新手学习,高手交流。