《老罗Android》学习之SQLite

来源:互联网 发布:数组大小可以任意改变 编辑:程序博客网 时间:2024/05/01 15:28

1、SQlite是什么?
SQLite 是进程内的数据库引擎,不存在数据库的客户端和服务器,使用SQLite只需要带上它的一个动态库,就可以享用它的全部功能。
2、SQLiteOpenHelper的使用
  我们要使用SQlite,首先要得到一个SQliteDatabase对象,那么怎么得到它呢?

首先,我们要得到一个SQliteOpenHelper对象,然后用这个SQliteOpenHelper对象 的getReadableDatabase()或getWritableDatabase()方法获得可读或可写的数据库,从而得到一个SQLiteDatebase对象。然后再用这个SQLiteDatebase对象对数据库进行操作就可以了。我们来看一下代码:

//DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能,
//第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作
//第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作

3.对SQLite进行 增、删、改、查 操作
采用MVC模式:即service:服务层;  Dao:数据访问层;  操作层。
1.PersonService2.java 定义接口
[java] view plain copy
 print?
  1. public interface PersonService2 {  
  2.     public boolean addPerson(ContentValues values);   
  3.     public boolean deletePerson(String whereClause, String[] whereArgs);      
  4.     public boolean updatePerson(ContentValues values, String whereClause, String[] whereArgs);    
  5.     public Map<String,String> viewPerson(String selection, String[] selectionArgs);     
  6.     public List<Map<String,String>> listPersonMaps(String selection, String[] selectionArgs);  
  7. }  
2. PersonDao2.java 实现方法
[java] view plain copy
 print?
  1. public class PersonDao2 implements PersonService2 {  
  2.     private DbOpenHelper helper = null;  
  3.     public PersonDao2(Context context) {  
  4.         helper = new DbOpenHelper(context);  
  5.     }  
  6.     public boolean addPerson(ContentValues values) {  
  7.         boolean flag = false;  
  8.         SQLiteDatabase database = null;  
  9.         long id = -1;  
  10.         try {  
  11.             database = helper.getWritableDatabase();  
  12.             id = database.insert("person"null, values);  
  13.             flag = (id != -1 ? true : false);  
  14.         } catch (Exception e) {  
  15.         } finally {  
  16.             if (database != null) {  
  17.                 database.close();  
  18.             }  
  19.         }  
  20.         return flag;  
  21.     }  
  22.     public boolean deletePerson(String whereClause, String[] whereArgs) {  
  23.         boolean flag = false;  
  24.         SQLiteDatabase database = null;  
  25.         int count = 0;  
  26.         try {  
  27.             database = helper.getWritableDatabase();  
  28.             count = database.delete("person", whereClause, whereArgs);  
  29.             flag = (count > 0 ? true : false);  
  30.         } catch (Exception e) {  
  31.         } finally {  
  32.             if (database != null) {  
  33.                 database.close();  
  34.             }  
  35.         }  
  36.         return flag;  
  37.     }  
  38.     public boolean updatePerson(ContentValues values, String whereClause,  
  39.             String[] whereArgs) {  
  40.         boolean flag = false;  
  41.         SQLiteDatabase database = null;  
  42.         int count = 0;// 影响数据库的行数  
  43.         try {  
  44.             database = helper.getWritableDatabase();  
  45.             count = database.update("person", values, whereClause, whereArgs);  
  46.             flag = (count > 0 ? true : false);  
  47.         } catch (Exception e) {  
  48.         } finally {  
  49.             if (database != null) {  
  50.                 database.close();  
  51.             }  
  52.         }  
  53.         return flag;  
  54.     }  
  55.         //应用中通过id查询,所以只得到单条记录,即cursor.moveToNext()就为null了。  
  56.     public Map<String, String> viewPerson(String selection,String[] selectionArgs) {  
  57.         // select 返回的列的名称(投影查询) from  
  58.         SQLiteDatabase database = null;  
  59.         Cursor cursor = null;  
  60.         Map<String, String> map = new HashMap<String, String>();  
  61.         try {  
  62.         database = helper.getReadableDatabase();  
  63.         cursor = database.query(true"person"null, selection,  
  64.                 selectionArgs, nullnullnullnull);  
  65.         int cols_len = cursor.getColumnCount();  
  66.         while (cursor.moveToNext()) {  
  67.             for (int i = 0; i < cols_len; i++) {//循环,把这一行每一列的值都取出来  
  68.                 String cols_name = cursor.getColumnName(i);  
  69.             String cols_value = cursor.getString(cursor.getColumnIndex(cols_name));  
  70.                 if (cols_value == null) {  
  71.                     cols_value = "";  
  72.                 }  
  73.                 map.put(cols_name, cols_value);  
  74.             }  
  75.         }  
  76.         } catch (Exception e) {  
  77.             e.printStackTrace();  
  78.         } finally {  
  79.             if (database != null) {  
  80.                 database.close();  
  81.             }  
  82.         }  
  83.         return map;  
  84.     }  
  85.     public List<Map<String, String>> listPersonMaps(String selection,String[] selectionArgs) {  
  86.         List<Map<String, String>> list = new ArrayList<Map<String, String>>();  
  87.         SQLiteDatabase database = null;  
  88.         Cursor cursor = null;  
  89.         try {  
  90.         database = helper.getReadableDatabase();  
  91.         cursor = database.query(false"person"null, selection,  
  92.                 selectionArgs, nullnullnullnull);  
  93.         int cols_len = cursor.getColumnCount();  
  94.         while (cursor.moveToNext()) {  
  95.             Map<String, String> map = new HashMap<String, String>();  
  96.             for (int i = 0; i < cols_len; i++) {  
  97.                 String cols_name = cursor.getColumnName(i);  
  98.                 String cols_value = cursor.getString(cursor.getColumnIndex(cols_name));  
  99.                 if (cols_value == null) {  
  100.                     cols_value = "";  
  101.                 }  
  102.                 map.put(cols_name, cols_value);  
  103.             }  
  104.             list.add(map);  
  105.         }  
  106.         } catch (Exception e) {  
  107.             e.printStackTrace();  
  108.         } finally {  
  109.             if (database != null) {  
  110.                 database.close();  
  111.             }  
  112.         }  
  113.         return list;  
  114.     }  
  115. }  

4. 应用层
  老罗的视频中是用一个测试设备来测试,我们在真机上测试不采用这种方法,我在一个Actvity中实现对SQLite的操作。源码如下:

[java] view plain copy
 print?
  1. public class MainActivity extends Activity {  
  2.     private PersonDao personService = null;  
  3.     private final static String TAG = "SQLite";  
  4.     private ListView listView;  
  5.     private Button button1, button2, button3, button4, button5;  
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_main);  
  10.         personService = new PersonDao(this);  
  11.         listView = (ListView) this.findViewById(R.id.listView1);  
  12.         /........找到button.........../  
  13.         button1.setOnClickListener(new OnClickListener() {  
  14.             public void onClick(View v) {  
  15.                 addPerson(); //添加人员  
  16.             }  
  17.         });  
  18.         button2.setOnClickListener(new OnClickListener() {  
  19.             public void onClick(View v) {  
  20.             deletePerson(" id = ? "new String[] { "2" });//删除id为2的记录  
  21.             }  
  22.         });  
  23.         button3.setOnClickListener(new OnClickListener() {  
  24.             public void onClick(View v) {  
  25.             updatePerson(" id = ? "new String[] { "3" });//更新人员  
  26.             }  
  27.         });  
  28.         button4.setOnClickListener(new OnClickListener() {  
  29.             public void onClick(View v) {  
  30.             viewPerson(" id = ? "new String[] { "3" });//通过id,查看单条记录  
  31.             }  
  32.         });  
  33.         button5.setOnClickListener(new OnClickListener() {  
  34.             public void onClick(View v) {  
  35.             listPerson(nullnull);//不限制条件,就可查询全部记录  
  36.             }  
  37.         });  
  38.     }  
  39.     public void addPerson() {  
  40.         ContentValues values = new ContentValues();// 类似map的属性  
  41.         values.put("name""杰克");  
  42.         values.put("address""江西");  
  43.         values.put("sex""男");  
  44.         boolean flag = personService.addPerson(values);  
  45.         Log.i(TAG, "addPerson--->>" + flag);  
  46.     }  
  47.     public void deletePerson(String whereClause, String[] whereArgs) {  
  48.         // delete from person where id = ?  
  49.         // 不包含 where关键字  
  50.         boolean flag = personService.deletePerson(whereClause, whereArgs);  
  51.         Log.i(TAG, "deletePerson--->>" + flag);  
  52.     }  
  53.     public void updatePerson(String whereClause, String[] whereArgs) {  
  54.         ContentValues values = new ContentValues();// 类似map的属性  
  55.         values.put("name""杰克");  
  56.         values.put("address""纽约");  
  57.         values.put("sex""女");  
  58.         boolean flag = personService.updatePerson(values, whereClause,whereArgs);  
  59.         Log.i(TAG, "updatePerson--->>" + flag);  
  60.     }  
  61.     public void viewPerson(String selection, String[] selectionArgs) {  
  62.         Map<String, String> map = personService.viewPerson(selection,  
  63.                 selectionArgs);  
  64.         Log.i(TAG, "viewPerson--->>" + map.toString());  
  65.     }  
  66.     public void listPerson(String selection, String[] selectionArgs) {  
  67.         List<Map<String, String>> list = personService.listPersonMaps(  
  68.                 selection, selectionArgs);  
  69.         Log.i(TAG, "listPerson--->>" + list.toString());  
  70.         query(list);  
  71.     }  
  72.     public void query(List<Map<String, String>> list) {  
  73.         // 需要显示多行,用SimpleAdapter.  
  74.         SimpleAdapter adapter = new SimpleAdapter(this, list,  
  75.             R.layout.simple_list_item, new String[] { "name""address",  
  76.             "sex" }, new int[] { R.id.textView1, R.id.textView2,R.id.textView3 });  
  77.         listView.setAdapter(adapter);  
  78.     }  
  79. }  

person表中有4个字段:id,name,address,sex.  在SimpleAdapter 的new  String[]参数中写入这4个字段的某些值,就会在listView中显示相应的数据,这个SimpleAdapter 会自动为我们从list列表中找出这些数据,相当智能是吧,呵呵。

效果图:


0 0
原创粉丝点击