SQLiteDatabase数据库操作详解

来源:互联网 发布:plu直播软件 编辑:程序博客网 时间:2024/06/05 22:52
今天花了点时间总结了一下数据的相关知识android中系统自带的数据库SQLiteDatabase数据库,这种数据库操作起来比ormLite数据库(第三方的)麻烦点,但是我对这种数据库操作比较熟悉所以我就采用了这种数据库,如有错误欢迎大家批评指正,谢谢

1.SQLiteDatabase
       SQLiteDatabase本身是一个数据库的操作类,但是如果想进行数据库的操作,还需要android.database.sqlite.SQLiteOpenHelper类的帮助,在执行SQL语句时execSQL()方法不能返回一个值
下图为Android中对execSQL()方法的说明

2.SQLiteOpenHelper(摘自李兴华android实战开经典)
    SQLiteOpenHelper是数据库操作的辅助类,并且它是一个抽象类,所以使用时需要定义其子类,并且在子类中复写相应的抽象方法。

在SQLiteOpenHelper类中定义了三个回调方法。
    2.1 onCreate()
          此方法在第一次使用数据库时调用生成相应的数据库表,但是此方法并不是在实例化SQLiteOpenHelper类的对象时调用,而是通过对象调用了getReadableDatabase()或getWriteableDatabase()方法时才会调用。
    2.2 onUpgrade()
          当数据库升级时会调用此方法,一般可以再此方法中将数据表删除,并且在删除表之后往往会调onCreate()方法重新创建新的数据表。
    2.3 onopen()
          当数据库打开时会调用此方法,但是一般情况下用户不需要复写此方法。

3.Android中数据库的增删改查示例代码
 3.1布局图如下

3.2主机面的代码如下:
package com.example.contentvaluespractice;import android.app.Activity;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.os.Bundle;import android.view.View;public class MainActivity extends Activity {          private SQLiteDatabase db;     @Override     protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);           setContentView(R.layout. activity_main);                      SQLiteOpenHelper helper= new DatabaseHelper(this);//SQLiteOpenHelper帮助类进行数据库的操作           //执行oncreate 方法返回数据库。db数据库只有在执行了getWritetableDatabase()或getReadableDatabase()方法后执行Oncreate()方法才创建            db=helper.getWritableDatabase();      }           //向数据库中插入数据的两种方式,一种是通过sql语句,一种是通过android提供的方法     public void insert(View view){      //插入数据的sql语句方法      String sql="insert into personData(name,age,birthday) values ('dmk',null,'1988-9-10')";//sql语句执行插入操作      db.execSQL(sql);      //插入数据的第二种方式android中提供的方法      //使用ContentValues进行插入操作ContentValues相当于java中的Map以键值对的形式存在      ContentValues cv= new ContentValues();       cv.put("name", "dmj");      cv.put("age", 26);      db.insert("personData", null,cv);          }   //从数据库中删除数据两种方式,一种是通过sql语句,一种是通过android提供的方法   public void delete(View view){        //1.使用android中的方式       String whereClause= "name=?"; //删除条件       String[] whereArgs={ "dmk"};       db.delete("personData", whereClause, whereArgs);      //2.使用execSQL方式实现       String sql= "delete from personData where name='dmj'" ;       db.execSQL(sql);     }  //更新数据库中的数据2种方式   public void update(View view){    //1.使用安卓中的ContentValues    ContentValues cv= new ContentValues();    cv.put( "name", "df"); //添加要更改的字段及内容//  String whereClause="name=?";//  String[] whereArgs={" dmk"};//  db.update("personDate", cv, whereClause, whereArgs);    db.update("personData", cv, "name=?", new String[]{"dmk"});    //2.使用execSQL的方式实现    String sql= "update [personData] set age=20 where name='dmj'";    db.execSQL(sql);   //execSQL()方法不能返回一个值,   }  //查询数据1   /*    * 通过query实现查询的 public Cursor query(String table, String[] columns, String selection, String[]   selectionArgs,  String groupBy, String having, String orderBy, String limit)         各参数说明:     table:表名称     colums:列名称数组     selection:条件子句,相当于where   举例 "name=?"     selectionArgs:条件语句的参数数组  举例 new String[]{ "dmk"}     groupBy:分组     having:分组条件     orderBy:排序类     limit:分页查询的限制     Cursor:返回值,相当于结果集ResultSet    */   public void query(View view){        Cursor cs= db.query( "personData", null, null, null, null, null, null);        if(cs.moveToNext()){              for( int i=0;i<cs.getCount();i++){                   cs.move(i);                   String name=cs.getString(cs.getColumnIndex("name" ));                   int age=cs.getInt(cs.getColumnIndex( "age"));                   System. out.println(name+ ":"+age);                   System.out.println(cs.getColumnIndex("name" ));                   System. out.println(cs.getColumnIndex( "age"));                   System. out.println(cs.getColumnCount());              }        }              }  //数据查询2   //通过rawQuery实现的带参数查询   /*   Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"Jack Johnson"});   if(cursor.moveToFirst()) {   String password = c.getString(c.getColumnIndex("password"));   */   public void rawquery(View view){        Cursor c= db.rawQuery( "select * from personData where name=?", new String[]{"dmj"});        if(c.moveToNext()){             int age=c.getInt(c.getColumnIndex( "age"));              System. out.println(age);        }   }}
3.3DatabaseHelpter类的代码如下:
<pre name="code" class="java"><pre name="code" class="java">package com.example.contentvaluespractice;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DatabaseHelper extends SQLiteOpenHelper {     private static final String DB_NAME = "person.db"; //数据库名称    private static final int version = 1; //数据库版本        public DatabaseHelper (Context context) {        super(context, DB_NAME, null, version);    }     @Override    public void onCreate(SQLiteDatabase db) { //此方法只有在调用getWritableDatabase()或getReadableDatabase()方法时才会执行        String sql = "create table personData("+                 "id        integer primary key," +                      "name      varchar(20) not null," +                      "age       Integer," +                      "birthday date)";                 db.execSQL(sql);    }    //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade      @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        db.execSQL("。。。。。。。。");      }}
4.针对游标的方法


方法名称方法描述getCount()总记录条数isFirst()判断是否第一条记录isLast()判断是否最后一条记录moveToFirst()移动到第一条记录moveToLast()移动到最后一条记录move(int offset)移动到指定的记录moveToNext()移动到吓一条记录moveToPrevious()移动到上一条记录getColumnIndex(String columnName)获得指定列索引的int类型值
5 使用Contenvalues 注意事项

insert的一种构造方法

public long insert (String table, String nullColumnHack, ContentValues values)

 

table

要插入数据的表的名称

 

values

ContentValues对象,类似一个map通过键值对的形式存储值。

 

nullColumnHack

当values参数为空或者里面没有内容的时候,insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,要在这里指定一个列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。通过观察源码的insertWithOnConflict方法可以看到当ContentValues类型的数据initialValues为null或size<=0时,就会在sql语句中添加nullColumnHack的设置。

若不添加nullColumnHack则sql语句最终的结果将会类似insert into tableName()values(NULL);这是不允许的。

若添加上nullColumnHack则sql语句将会变成insert into tableName (nullColumnHack)values(null);这是可以的。







2 0
原创粉丝点击