SQLite数据库操作.docx
- 文档编号:10962238
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:27
- 大小:41.34KB
SQLite数据库操作.docx
《SQLite数据库操作.docx》由会员分享,可在线阅读,更多相关《SQLite数据库操作.docx(27页珍藏版)》请在冰豆网上搜索。
SQLite数据库操作
1、课程名称:
SQLite数据库操作
2、知识点
2.1、上次课程的主要知识点
2.2、本次预计讲解的知识点
3、具体内容
3.1、包含功能的实际应用(重点)
使用包含页的形式处理显示内容时,如果有一些需要改变的内容或需要统一进行配置的内容,可以通过编写一个公共的继承父类,来完成这些处理。
publicabstractclassBaseActivityextendsActivity{
privateTextViewtitleText;
privateButtonsettingBtn;
//声明底部按钮的数组
privateButton[]allBottomBtns=newButton[3];
//没有选中时的按钮图片
privateint[]allBottomImgs={R.drawable.bottom_01_a,
R.drawable.bottom_02_a,R.drawable.bottom_03_a};
//选中后的按钮图片
privateint[]allBottomImgsSelected={R.drawable.bottom_01_b,
R.drawable.bottom_02_b,R.drawable.bottom_03_b};
//目标的class
privateClass[]allTargetActivties={MainActivity.class,
QuestionListActivity.class,SearchActivity.class};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
}
protectedvoidinit(Stringtitle,intselected){
titleText=(TextView)findViewById(R.id.title_text);
settingBtn=(Button)findViewById(R.id.setting_btn);
allBottomBtns[0]=(Button)findViewById(R.id.bottom_btn_01);
allBottomBtns[1]=(Button)findViewById(R.id.bottom_btn_02);
allBottomBtns[2]=(Button)findViewById(R.id.bottom_btn_03);
titleText.setText(title);
//可以公共的为settingBtn设置一些事件
settingBtn.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
Toast.makeText(BaseActivity.this,"这里是设置按钮",Toast.LENGTH_SHORT)
.show();
}
});
//设置图片
for(inti=0;i //定义临时变量,分配给每个监听 finalinttemp=i; //当前选中的是哪个按钮 if(selected==i){ //选中的 allBottomBtns[i] .setBackgroundResource(allBottomImgsSelected[i]); }else{ allBottomBtns[i].setBackgroundResource(allBottomImgs[i]); //如果当前按钮没有被选中,则可以点击,允许切换界面,这里要加入监听. allBottomBtns[i].setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ Intentin=newIntent(BaseActivity.this, allTargetActivties[temp]); startActivity(in); } }); } } } } 使用时,可以通过调用super.init()方法来进行设置和初始化 //在设置完界面以后,初始化父类中的头部和底部的信息 super.init("程序员面试宝典",0); 3.2、SQLite数据库的基本操作(重点) SQLite是移动设备的常用数据库,是一种小型数据库,Android中使用的是SQLite3. SQLite中一共只有5种数据类型,其中分别有: NULL,Integer,TEXT,BLOB,REAL。 在SQLite中如果想建立库和建立表,需要编写一个数据库连接操作类,继承SQLiteOpenHelper类。 publicclassDataBaseConnectionextendsSQLiteOpenHelper{ privatestaticfinalintDBVERSION=1; privatestaticfinalStringDBNAME="test.db"; publicDataBaseConnection(Contextctx){ super(ctx,DBNAME,null,DBVERSION); } publicDataBaseConnection(Contextcontext,Stringname, CursorFactoryfactory,intversion){ super(context,name,factory,version); } //db就等同于之前的Connection @Override publicvoidonCreate(SQLiteDatabasedb){ //编写建表语句,当第一次建立库时,需要初始化项目中用到的所有表. //建立一张新闻表 Stringsql="CREATETABLEnews("+ "idintegerprimarykey,"+ "titletextnotnull,"+ "contenttextnotnull,"+ "pub_datetextnotnull,"+ "typeintegernotnull"+ ")"; //执行 db.execSQL(sql); } @Override publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){ //当数据库版本更新时,自动执行这里的脚本,对数据库中一些改动内容进行调整. Stringsql="ALTERTABLEnewsADDphotoTEXT"; db.execSQL(sql); } } 当取得数据库连接时,就会自动执行建立表和建立库的操作。 protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DataBaseConnectiondbc=newDataBaseConnection(this); dbc.getWritableDatabase(); } 建立好库后,可以在data/data/包名/databases/中找到自己建立好的数据库,如果想通过控制台查看数据库的具体内容,需要使用SDK提供的adbshell命令,进入Android的底层linux系统,通过root用户来调用sqlite的命令,运行这个数据库。 然后可以开始编写一些数据库操作,这里先完成一个添加和一个数据列表操作。 publicstaticvoidinsertData(SQLiteDatabasedb,Map Stringsql="INSERTINTOnews(title,content,pub_date,type)VALUES(? ? ? ? )"; //执行 db.execSQL(sql,newObject[]{map.get("title"),map.get("content"), map.get("pubDate"),map.get("type")}); } publicstaticList Stringsql="SELECTid,title,content,pub_date,typeFROMnews"; //Cursor就等同于jdbc中的ResultSet Cursorc=db.rawQuery(sql,null); //参考JDBC的写法,循环返回一个Map集合 List //手工调整游标位置 c.moveToFirst(); while(! c.isAfterLast()){ Map map.put("id",c.getInt(0)); map.put("title",c.getString (1)); map.put("content",c.getString (2)); map.put("pub_date",c.getString(3)); map.put("type",c.getInt(4)); allValues.add(map); //手工向下移动游标 c.moveToNext(); } //关闭 c.close(); returnallValues; } 3.3、使用SQLite+ListView完成数据分页功能 先建立好数据库表,这里只需要一张问题表即可,如果想自行扩展,可以加入一个分类表,来分类显示问题。 publicclassDataBaseConnectionextendsSQLiteOpenHelper{ privatestaticfinalintDBVERSION=1; privatestaticfinalStringDBNAME="question.db"; publicDataBaseConnection(Contextctx){ super(ctx,DBNAME,null,DBVERSION); } publicDataBaseConnection(Contextcontext,Stringname, CursorFactoryfactory,intversion){ super(context,name,factory,version); } @Override publicvoidonCreate(SQLiteDatabasedb){ Stringsql="CREATETABLEquestion("+ "idintegerprimarykey,"+ "questiontextnotnull,"+ "answertextnotnull"+ ");"; db.execSQL(sql); } @Override publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){ } } 在Globals中声明数据库操作对象,而且只声明一个。 publicclassQuestionDAOUtils{ publicstaticvoidinsertData(Map Stringsql="INSERTINTOquestion(question,answer)VALUES(? ? )"; Globals.dbc.getWritableDatabase().execSQL(sql, newObject[]{map.get("question"),map.get("answer")}); } publicstaticList Stringsql="SELECTid,question,answerFROMquestion"; Cursorc=Globals.dbc.getReadableDatabase().rawQuery(sql,null); List c.moveToFirst(); while(! c.isAfterLast()){ Map map.put("question",c.getInt(0)+"-->"+c.getString (1)); map.put("answer",c.getString (2)); allValues.add(map); c.moveToNext(); } c.close(); returnallValues; } } 编写调用操作 添加部分进行修改 }elseif("END_FLAG".equals(line)){ //需要将问题答案整合,并保存到数据库里 //将数据集体放入到Map中,再加入到数据库里 Map map.put("question",question.toString()); map.put("answer",answer.toString()); //调用数据库操作 QuestionDAOUtils.insertData(map); //清空问题和答案 question=newStringBuilder(); answer=newStringBuilder(); }else{ 列表部分也要修改 list=(ListView)findViewById(R.id.list); allValues=QuestionDAOUtils.listData(); adapter=newSimpleAdapter(this,allValues,R.layout.question_line, newString[]{"question"},newint[]{R.id.line_question}); SharedPreferences 通过SharedPreferences可以保存一些变量到一个XML文件中,再通过该对象可以读取出来。 因此一般通过这个变量保存一些标志性的信息,例如: 是否之前打开过这个应用,数据是否之前初始化过,上次阅读到哪个位置。 在这里通过该对象建立一个标志,防止重复读取数据。 也防止用户在读取到一半时退出,导致数据不完整。 先编写一个删除数据的方法 publicstaticvoiddeleteAllData(){ Stringsql="DELETEFROMquestion"; Globals.dbc.getWritableDatabase().execSQL(sql); } 在初始化数据时,进行判断 //加入线程,实现界面的切换 Threadt=newThread(){ @Override publicvoidrun(){ //取得SharedPreferences保存的标志位 SharedPreferencess=getSharedPreferences("temp",MODE_PRIVATE); booleansavedFlag=s.getBoolean("flag",false); if(savedFlag){ //之前读取过了,而且成功了. try{ Thread.sleep(1000); }catch(Exceptione){ e.printStackTrace(); } }else{ //先将数据库中的原有数据删除 QuestionDAOUtils.deleteAllData(); //读取question.txt的内容 //取得assets目录下的文件内容 try{ InputStreamis=getAssets().open("question.txt"); BufferedReaderreader=newBufferedReader( newInputStreamReader(is,"GBK")); //逐行读取数据 initDataFromFile(reader); reader.close(); }catch(Exceptione){ e.printStackTrace(); } //保存标志 Editore=s.edit(); e.putBoolean("flag",true); //确认提交 mit(); } //切换界面 Intentin=newIntent(IndexActivity.this,MainActivity.class); startActivity(in); //切换后将自己关闭 finish(); } }; t.start(); 分页操作,通过SQLite编写分页不需要再使用ROWNUM配合子查询完成,而是直接通过LIMIT关键字来实现。 完成数据库操作 publicstaticList intpageSize){ Stringsql="SELECTid,question,answerFROMquestionLIMIT? ? "; Cursorc=Globals.dbc.getReadableDatabase().rawQuery( sql, newString[]{String.valueOf((pageNo-1)*pageSize), String.valueOf(pageSize)}); List c.moveToFirst(); while(! c.isAfterLast()){ Map map.put("question",c.getInt(0)+"-->"+c.getString (1)); map.put("answer",c.getString (2)); allValues.add(map); c.moveToNext(); } c.close(); returnallValues; } publicstaticintgetAllCount(){ Stringsql="SELECTCOUNT(*)FROMquestion"; Cursorc=Globals.dbc.getReadableDatabase().rawQuery(sql,null); c.moveToFirst(); intcount=c.getInt(0); c.close(); returncount; } 修改列表界面,先查询出第一页的数据。 publicclassQuestionListActivityextendsBaseActivity{ privateListViewlist; privateSimpleAdapteradapter; privateList //声明几个分页的标量 privateintpageNo=1; privateintpageSize=15; privateintcount=0; privateintallPages=0; @O
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQLite 数据库 操作