SQLiteDatabase数据库操作详解
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); } } }
<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("。。。。。。。。"); } }
方法名称 | 方法描述 |
---|---|
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);这是可以的。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。