第1章SQLite本章目标创建数据库和表对SQLite数据库进行增删查改了解SQLiteDatabase和SQLiteOPenHelper类了解两类的方法及参数意义灵活使用SQLiteDatabase和SQLiteOPenHelperSQLite简介·Android系统集成了一个轻量级的数据库:SQLite。SQLite并不想成为像Oracle、MySQL那样的数据库。·SQLite只是一个嵌入式的数据库引擎,专门适用于资源有限的设备(如手机,PDA等)上适量数据存取。·SQLite允许开发者使用sql语句操作数据库的数据,SQLite数据库只是一个文件。·当有大量数据读写时,而且需要面临大量用户的并发存储时,不可以依靠该数据库。Android提供了SQLiteDatabase代表一个数据库(底层就是一个数据库文件),一旦应用程序获得了代表指定数据库的SQLiteDatabase对象,接下来就可以通过SQLiteDatabase来管理、操作数据库了。1.1SQLite打开数据库的三种方式(1)打开path文件所代表的SQLite数据库。staticSQLiteDatabaseopenDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory,intflags)(2)打开或创建(如果不存在)file文件所代表的SQLite数据库。staticSQLiteDatabaseopenOrCreateDatabase(Filefile,SQLiteDatabase.CursorFactoryfactory)(3)打开或创建(如果不存在)path文件所代表的SQLite数据库。staticSQLiteDatabaseopenOrCreateDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory)1.2操作数据库执行带占位符的SQL语句execSQL(Stringsql,Object[]bindArgs)执行sql语句execSQL(Stringsql)向指定的表中插入数据insert(Stringtable,StringnullColumnHack,ContentValuesvalues,)更新指定表中的特定数据update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)删除表中的特定数据delete(Stringtable,StringwhereClause,String[]whereArgs)对指定数据表执行查询Cursorquery(Stringtable,String[]columns,StringwereClause,String[]whereArgs,StirnggroupBy,Stringhaving,StringorderBy)对指定数据表执行查询Cursorquery(Stringtable,String[]columns,StringwereClause,String[]whereArgs,StirnggroupBy,Stringhaving,StringorderByStringlimit)limit参数用来控制最多查询几条记录(用于控制分页的参数)对指定数据表执行查询,其中第一个参数控制是否去除重复值Cursorquery(Booleandistinct,Stringtable,String[]columns,StringwereClause,String[]whereArgs,StirnggroupBy,Stringhaving,StringorderByStringlimit)执行带占位符的sql查询rawQuery(Stringsql,String[]selectionArgs)开始事务beginTransaction()结束事务endTransaction()Cursor对象上面的查询方法都是返回一个Cursor对象,Android中的Cursor类似于JDBC的ResultSet,Cursor同样提供了如下方法来移动查询结果的记录指针。move(intoffset):将记录指针向上或向下移动指定的行数。offset为正数就是向下移动;为负数就是向上移动。BooleanmoveToFirst():将记录指针移动到第一行,如果移动成功返回true。BooleanmoveToLast():将记录指针移动到最后一行,如果移动成功返回true。BooleanmoveToNext():将记录指针移动到下一行,如果移动成功返回true。BooleanmoveToPosition(intposition):将记录指针自动到指定行,如果移动成功则返回true。BooleanmoveToPrevious():将记录指针移动到上一行,如果移动成功则返回true。一旦将记录指针移动到指定行之后,接下来就可以调用Cursor的getXxx()方法获取该行的指定列的数据。第三节创建数据库和表创建一个数据库try{//方法一:SQLiteDatabase.openDatabase(data/data/com.android.sqllite/temp.db,null,SQLiteDatabase.OPEN_READONLY|SQLiteDatabase.CREATE_IF_NECESSARY);}catch(Exceptione){System.out.println(e.getMessage());}//方法二SQLiteDatabase.openOrCreateDatabase(data/data/com.android.sqllite/temp1.db,null);//方法三:Filefile=newFile(data/data/com.android.sqllite/temp2.db);SQLiteDatabase.openOrCreateDatabase(file,null);提示:不加try-catch语句块不能正常执行。上述返回的是一个SQLiteDatabase对象。SQLiteDatabase.CursorFactory该参数是一个用于返回Cursor的工厂,如果指定参数为NULL,则意味着使用默认的工厂。创建一个表db=SQLiteDatabase.openOrCreateDatabase(file,null);Stringsql=createtableuser_inf(user_idintegerprimarykey,+user_namevarchar(255),+user_passvarchar(255));db.execSQL(sql);1.4使用sql语句操作SQLite数据库SQLiteDatabase的execSQL()方法可执行任意的SQL语句,包括带占位符的SQL语句。但由于该方法没有返回值,因此一般用于执行DDL语句或DML语句;SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。小实例:该程序提供两个文本框,用户可以在这两个文本框中输入内容,当用户点击“插入”按钮时,这两个文本框中的内容将会被插入数据库中。importjava.io.File;importandroid.database.Cursor;importandroid.database.sqlite.SQLiteDatabase;importandroid.os.Bundle;importandroid.support.v7.app.ActionBarActivity;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.ListView;importandroid.widget.SimpleCursorAdapter;publicclassMainActivityextendsActionBarActivity{privateSQLiteDatabasedb;privateButtonbn=null;privateListViewlistView=null;protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView=(ListView)findViewById(R.id.listView1);bn=(Button)findViewById(R.id.bt_yes);//创建数据库和表db=createDatabase();bn.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){//拿到数据Stringtitle=((EditText)findViewById(R.id.et_name)).getText().toString();Stringcontent=((EditText)findViewById(R.id.et_content)).getText().toString();try{//插入数据库insertData(db,title,content);//开始查询Cursorcursor=db.rawQuery(select*fromnews_inf5,null);inflateList(cursor);}catch(Exceptione){Stringsql=createtablenews_inf5(_idintegerprimarykeyautoincrement,+new_titlevarchar(255),+new_contentvarchar(255));db.execSQL(sql);//插入数据库insertData(db,title,content);//开始查询Cursorcursor=db.rawQuery(select*fromnews_inf5,null);inflateList(cursor);}}});}publicSQLiteDatabasecreateDatabase(){try{/*//方法一:SQLiteDatabase.openDatabase(data/data/com.android.sqllite/temp.db,null,SQLiteDatabase.OPEN_READONLY|SQLiteDatabase.CREATE_IF_NECESSARY);//方法二:SQLiteDatabase.openOrCreateDatabase(data/data/com.android.sqllite/temp1.db,null);*//***得到数据库*///方法三:Filefile=newFile(data/data/com.android.sqllite/temp2.db);db=SQLiteDatabase.openOrCreateDatabase(file,null);}catch(Exceptione){e.printStackTrace();}returndb;}publicvoidinsertData(SQLiteDatabasedb,Stringtitle,Stringcontent){//执行插入语句db.execSQL(insertintonews_inf5values(null,?,?),newString[]{title,content});}/***