SQLite(2)

学习SQLite数据库之前,先去学习数据库中的增删改查语句,以前用工具创建表,表字段,那么请重新学习SQLite,它是和数据库操作差不多,不过它轻量级的,很多事情是做不了的。下面事几个简单的语句:

[html]  view plain  copy
  1. create table user(id INTEGER primary key autoincrement,username char(20),userpwd char(20));  
  2. select * from user where id = 2;  
  3. update user set username = 'ice' where id = 2;  
  4. insert into(username,userpwd) values('li','123456');  
  5. delete from user where id = 2;  

上面事一些基本的语句,需要详细了解的,可以去网络上查找相关知识。

接下来介绍一些如何操作数据库呢?

第一点,SQLite嵌入式的,轻量级的数据库,它已经放在了Android手机上,并不是像后台需要去链接数据库。SQLite将存储的信息放入到指定的路径下data/<项目文件夹>/databases/。

像要使用SQLite,那么就需要去继承SQLiteOpenHelper,它来执行创建,增删改查相关的操作。继承SQLiteOpenHelper后,必须要实现两个方法,和实现一个构造函数。两个方法分别事onCreate(SQLiteDatabase db) 和 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 。一个事创建表,一个是用来升级数据库的。

构造函数中,需要去些指出数据库名和数据库版本。

[html]  view plain  copy
  1. public class DBOpenHelper extends SQLiteOpenHelper{  
  2.   
  3.     private static final String DATABASENAME = "test.db"; //数据库名称  
  4.     private static final int DATABASEVERSION = 2;//数据库版本,大于0  
  5.   
  6.     //数据库的创建  
  7.     public DBOpenHelper(Context context) {  
  8.         super(context, DATABASENAME, null, DATABASEVERSION);  
  9.     }  
  10.   
  11.     //创建表  
  12.     @Override  
  13.     public void onCreate(SQLiteDatabase db) {  
  14.         String sql = "create table user(id INTEGER primary key autoincrement,username char(20),userpwd char(20))";  
  15.         db.execSQL(sql);  
  16.   
  17.     }  
  18.   
  19.     //数据库的升级  
  20.     @Override  
  21.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  22.         String sql = "DROP TABLE IF EXISTS user";  
  23.         db.execSQL(sql);  
  24.   
  25.         onCreate(db);  
  26.     }  
  27. }  
OnCreate()方法只调用一次,onUpgrade(),当数据库版本改变的时候,就会调用。我在代码中在调用时,重新去删除到表后重新执行onCreate(db)。可以像到,为了获取db(db是用来操作数据库的),需要去创建一次,这样就不用每次创建的时候都去调用构造函数。下面事会实现的。

接下来就是如何操作数据库,操作数据库有两种方式,一种是执行sql语句,还有一个事db来执行,只需要去调用对象的方法,并将参数传过去。

这里将一个类建立起来,并获取到DBOpenHelper。


[html]  view plain  copy
  1. public class DataHelper {  
  2.     private DBOpenHelper mDBOpenHelper;  
  3.   
  4.   
  5.     private DataHelper(Context context){  
  6.         if (mDBOpenHelper == null){  
  7.             mDBOpenHelper = new DBOpenHelper(context);  
  8.         }  
  9.     }  
  10.     private static DataHelper mDataHelper;  
  11.   
  12.   
  13.     public static DataHelper getDataHelper(Context context){  
  14.         if (mDataHelper == null){  
  15.             mDataHelper = new DataHelper(context);  
  16.         }  
  17.         return mDataHelper;  
  18.     }  
  19. }  

1.插入

首先事插入。表创建了,如何去创建数据。

execSQL(str);

insert(table,null,values);

第一个是执行sql语句,例如:insert into user(username,userpwd) values(' + "ice“+"','" + "123456"+"')";放入到execSQL参数中。可以执行在函数中些上要执行的语句,其中ice和12345用形参来代替,如insert into user(username,userpwd) values(' + username+"','" + password+"')"来代替。

insert()方法中第一个参数事表名,第二个参数一般设置为null,第三个参数事要插入的值,这个值事ContentValues。

下面来看代码,放入在DataHelper中的代码:

[html]  view plain  copy
  1. /**  
  2.     * 执行sql语句  
  3.     * @param sql  
  4.     */  
  5.    public void insert(String sql){  
  6.        bdOpenHelper.getWritableDatabase().execSQL(sql);  
  7.    }  
  8.   
  9.    /**  
  10.     * 插入数据  
  11.     * @param username      插入的用户名  
  12.     * @param password      插入的密码  
  13.     */  
  14.    public void insert1(String username,String password){  
  15.        String str = "insert into user(username,userpwd) values('" + username + "','" + password + "')";  
  16.        bdOpenHelper.getWritableDatabase().execSQL(str);  
  17.    }  
  18.   
  19.    /**  
  20.     * 插入数据  
  21.     * @param values  
  22.     */  
  23.    public void insert2(ContentValues values){  
  24.        bdOpenHelper.getWritableDatabase().insert("user",null,values);  
  25.    }  

接下来看它的实现

private DataHelper dataHelper;

dataHelper = DataHelper.getDataHelper(SQLTestActivity.this);

[html]  view plain  copy
  1. /**  
  2.     * 保存数据  
  3.     */  
  4.    public void save(){  
  5.        String sql = "insert into user(username,userpwd) values('ice','123456')";  
  6.        try {  
  7.            dataHelper.insert(sql);  
  8.        } catch (Exception e) {  
  9.            e.printStackTrace();  
  10.        }  
  11.    }  
  12.   
  13.    public void save1(){  
  14.        try {  
  15.            dataHelper.insert1("ice","123456");  
  16.        } catch (Exception e) {  
  17.            e.printStackTrace();  
  18.        }  
  19.    }  
  20.   
  21.    public void save2(){  
  22.        ContentValues values = new ContentValues();  
  23.        values.put("username","ice");            //key值需要和创建表的字段名是一样的  
  24.        values.put("userpwd","123456");  
  25.        dataHelper.insert2(values);  
  26.    }  


2.查询

查询相对与其它会复杂一些,先来介绍有哪几种方法

[html]  view plain  copy
  1. 1 db.rawQuery(Stringsql, String[] selectionArgs);   
  2.   
  3. 2 db.query(Stringtable, String[] columns, String selection, String[] selectionArgs, StringgroupBy, String having, String orderBy);   
  4.   
  5. 3 db.query(Stringtable, String[] columns, String selection, String[] selectionArgs, StringgroupBy, String having, String orderBy, String limit);   
  6.   
  7. 4 db.query(Stringdistinct, String table, String[] columns, String selection, String[] selectionArgs,String groupBy, String having, String orderBy, String limit);   
还是有两种方式,一个rawQuery(),两个参数分别事sql语句,和查询的条件。

query()查询,传入的参数表明,获取的字段,查询的条件,查询条件的值。后面的参数用于分组,排序,分页(这里暂不考虑)。


[html]  view plain  copy
  1. /**  
  2.      * 查询  
  3.      * @param sql  
  4.      */  
  5.     public Cursor query(String sql,String[] selectionArgs){  
  6.         return bdOpenHelper.getWritableDatabase().rawQuery(sql, selectionArgs);  
  7.     }  
  8.   
  9.     public Cursor query1(String table, String[] columns,String selection,String[] selectionArgs){  
  10.         return bdOpenHelper.getWritableDatabase().query(table,columns,selection,selectionArgs,null,null,null);  
  11.     }  

实现:

[html]  view plain  copy
  1. public void query(){  
  2.         String sql = "select * from user where id = ?";     //?是占位符  
  3.         Cursor cursor = dataHelper.query(sql, new String[]{"1"});  
  4.         if (cursor.moveToFirst()){          //判断是光标移动到第一个位置时是否有值  
  5.             String username = cursor.getString(1);  
  6.             String password = cursor.getString(2);          //这里没有从0开始,因为0是id的值  
  7.         }  
  8.         cursor.close();                         //使用完后需要关闭  
  9.     }  
  10.   
  11.     public void query1(){  
  12.         Cursor cursor = dataHelper.query1("user", new String[]{"username", "userpwd"}, "id = ?", new String[]{"1"});  
  13.         while (cursor.moveToNext()){         //判断是光标移动到第一个位置时是否有值  
  14.             String username = cursor.getString(cursor.getColumnIndex("username"));  
  15.             String password = cursor.getString(cursor.getColumnIndex("userpwd"));          //这里没有从0开始,因为0是id的值  
  16.         }  
  17.   
  18.         cursor.close();  
  19.     }  
下面事Cursor的一些函数操作,有解释就不多说了。
[html]  view plain  copy
  1. 1.c.move(int offset); //以当前位置为参考,移动到指定行   
  2.  2 c.moveToFirst();    //移动到第一行   
  3.  3 c.moveToLast();     //移动到最后一行   
  4.  4 c.moveToPosition(int position); //移动到指定行   
  5.   
  6.  5 c.moveToPrevious(); //移动到前一行   
  7.  6 c.moveToNext();     //移动到下一行   
  8.  7 c.isFirst();        //是否指向第一条   
  9.  8 c.isLast();     //是否指向最后一条   
  10.  9 c.isBeforeFirst();  //是否指向第一条之前   
  11. 10c.isAfterLast();    //是否指向最后一条之后   
  12. 11 c.isNull(int columnIndex);  //指定列是否为空(列基数为0)   
  13. 12 c.isClosed();       //游标是否已关闭   
  14.   
  15. 13 c.getCount();       //总数据项数   
  16. 14c.getPosition();    //返回当前游标所指向的行数   
  17. 15c.getColumnIndex(String columnName);//返回某列名对应的列索引值   
  18. 16 c.getString(int columnIndex);   //返回当前行指定列的值  

3.修改

插入也事有两个方法:
execSQL(sql);
insert(String table,ContentValues values,String where,String[] where);
和上面的很相识,这里不详细介绍

[html]  view plain  copy
  1. /**  
  2.     * 修改  
  3.     * @param sql  
  4.     */  
  5.    public void update(String sql){  
  6.        try {  
  7.            bdOpenHelper.getWritableDatabase().execSQL(sql);  
  8.        } catch (SQLException e) {  
  9.            e.printStackTrace();  
  10.        }  
  11.    }  
  12.    public void update1(ContentValues values,String where,String[] whereArgs){  
  13.        try {  
  14.            bdOpenHelper.getWritableDatabase().update("user",values,where,whereArgs);  
  15.        } catch (Exception e) {  
  16.            e.printStackTrace();  
  17.        }  
  18.    }  

实现:
[html]  view plain  copy
  1. public void update(){  
  2.         String sql = "update user set username = '" + "li" + "' where id = '" + "1" + "'";  
  3.         dataHelper.update(sql);  
  4.     }  
  5.   
  6.     public void update1(){  
  7.         ContentValues values = new ContentValues();  
  8.         values.put("username","li");  
  9.         String where = "id = ?";  
  10.         String[] whereArgs = new String[]{"1"};  
  11.         dataHelper.update1(values,where,whereArgs);  
  12.     }  

4.删除

因为和上面很相似,这里就直接给出代码
[html]  view plain  copy
  1. /**  
  2.      * 删除数据  
  3.      * @param sql  
  4.      */  
  5.     public void delete(String sql){  
  6.         try {  
  7.             bdOpenHelper.getWritableDatabase().execSQL(sql);  
  8.         } catch (SQLException e) {  
  9.             e.printStackTrace();  
  10.         }  
  11.     }  
  12.   
  13.     public void delete(String where,String[] whereArgs){  
  14.         try {  
  15.             bdOpenHelper.getWritableDatabase().delete("user",where,whereArgs);  
  16.         } catch (Exception e) {  
  17.             e.printStackTrace();  
  18.         }  
  19.     }  
实现
  
  
[html] view plain copy
  1. /**  
  2.      * 删除数据  
  3.      */  
  4.     public void delete(){  
  5.         String sql = "delete from user where id = '" + "1" + "'";  
  6.         dataHelper.delete(sql);  
  7.     }  
  8.     public void delete1(){  
  9.         dataHelper.delete1("id = ?",new String[]{"1"});  
  10.     }  
上面是介绍原生的SQLite数据查询,如果对数据操作不是很大的话,原生的语句就可以了,但有时候需要一些框架来辅助自己完成。下面介绍一个框架。要说一点的是,采用框架,就会增大apk的体积,如果对数据操作不多,建议不要使用。
框架名字GreenDAO
GreenDAO
参考链接:
http://www.open-open.com/lib/view/open1438065400878.html
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1127/2069.html
http://greenrobot.org/greendao/documentation//introduction/

三步走
添加grandl
直接给出配置文件

Android ORM 框架之 greenDAO 使用心得
(抄)
[html]  view plain  copy
  1. sourceSets {  
  2.         main {  
  3.             java.srcDirs = ['src/main/java', 'src/main/java-gen']  
  4.         }  
  5.     }  
[html]  view plain  copy
  1. compile 'org.greenrobot:greendao:2.2.1'  
  2. compile 'org.greenrobot:greendao-generator:2.2.0'  
上面两个compile都放在dependecies中。
然后在java res同文件中中创建java-gen文件夹,用于放生成的文件。
创建一个类来生成一些文件。
[html]  view plain  copy
  1. public class Test {  
  2.     private static Schema schema;  
  3.   
  4. //    public static void main(String args[]) throws Exception{  
  5. //        schema = new Schema(1,"com.ice.bean");  
  6. //        schema.setDefaultJavaPackageDao("com.ice.dao");  
  7. //        addAircle();  
  8. //        new DaoGenerator().generateAll(schema,"../ProjectDemo/app/src/main/java-gen");  
  9. //    }  
  10.   
  11.     private static void addAircle(){  
  12.         Entity aircle = schema.addEntity("Aircle");  
  13.         aircle.addIdProperty();     //主键  
  14.         aircle.addStringProperty("title").notNull();//其他属性,非空  
  15.     }  
  16. }  
注释掉的部分是用来生成一些文件,这些文件被放在java-gen中
讲解注释掉的代码
首先创建Schema,它的构造方法有两个参数,一个版本信息,一个是生成的包名,这个包名可以在java-gen中看到,bean是实体,就是将javabean映射成数据能够操作的实体,同时在来创建一个dao,该dao是用来做一些操作的,比如增删改查。然后调用addAircle方法,该方法就是用来生成实体类,生成数据库能够操作的实体类,aschema.addEntity(),创建Aircle这个类(该类在java-gen中),给这个类添加属性,需要一个主键ID,和一个其他属性。
[html]  view plain  copy
  1. new DaoGenerator().generateAll(schema,"../ProjectDemo/app/src/main/java-gen");这句代码就是告诉GreenDAO,我的java-gen的位置在哪里,ProjectDemo就是项目名。  
[html]  view plain  copy
  1. 运行起来就能够在java-gen看到com.ice.bean和com.ice.dao文件夹该文件夹下放了GreenDAO自动配置的文件。  
[html]  view plain  copy
  1. 具体操作  
[html]  view plain  copy
  1. 在继承了Application的类中的onCreate()方法中添上  
[html]  view plain  copy
  1. <pre name="code" class="html">// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。  
  2.     // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。  
  3.     // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。  
  4.     // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。  
  5.     private void setupDatabase(){  
  6.         DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);  
  7.         db = helper.getWritableDatabase();  
  8.         // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。  
  9.         daoMaster = new DaoMaster(db);  
  10.         daoSession = daoMaster.newSession();  
  11.     }  
 

具体实现如下:
[html]  view plain  copy
  1. private static DaoSession daoSession;  
  2. public static DaoSession getDaoSession() {  
  3.         return daoSession;  
  4.     }  
  5.   
  6.     public static void setDaoSession(DaoSession daoSession) {  
  7.         App.daoSession = daoSession;  
  8.     }  


[html]  view plain  copy
  1. private void initData(){  
  2.     Aircle aircle = new Aircle();  
  3.     aircle.setTitle("ice");  
  4.     getAircleDao().insert(aircle);          //插入数据  
  5.     List<Aircle> ice = getAircleDao().queryBuilder().where(AircleDao.Properties.Title.eq("ice"))  
  6.               .orderAsc(AircleDao.Properties.Id)    //进行排序  
  7.             .list();  
  8.     for (int i = 0; i < ice.size();i++){  
  9.         System.out.println(ice.get(i).getTitle());  
  10.     }  
  11. }  
  12. private AircleDao getAircleDao(){  
  13.     return App.getDaoSession().getAircleDao();  
  14. }  
获取到到DAOsession,通过session,连接数据库,并对其操作。
具体看上面给出的三个链接。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值