`

android 对sqlite数据库的增删改查

 
阅读更多

android平台下数据库的一些概念

Sqlite是android平台的一款轻量级的、嵌入式的、关系型数据库产品,以下是一些主要概念。

1.Sqlite通过文件保存数据库,创建的数据库文件默认存在在/data/data/<package>/databases/的文件

夹下,一个文件就是一个数据库。

2.一个数据库包含多个表格,一个表格包含不同的字段,字段类型等等,这与SQL数据库相似。

3.Sqlite记录没有顺序的概念,不存在第一第二类的概念,通过查询获取满足条件的记录。

android平台下操作数据库的的相关类

(1.)SQLiteOpenHelper 抽象类,用于创建和管理数据库以及版本,需要创建一个子类继承,该类封装

了对数据库操作的基本方法,使用方便。

(2.)SQLiteDatabase 数据库访问了,主要是对数据库的增删改查等常用操作,功能比

SQLiteOpenHelper丰富,比如事务管理,分页等等。

(3.)Cursor游标类,主要用来返回返回查询记录结果

SQLiteOpenHelper 类使用方法比较少,网上介绍也比较多,本程序主要采用SQLiteDatabase类操作数

据库,介绍android 平台下Sqlite的多种使用方法。主要功能如图-1界面所示。

图-1 Sqlite数据库界面的操作及其功能

图-2 创建的数据库截图

源码下载:Sqlite.zip
1.对数据库的操作

(1.)创建一个数据库

  1. //在文件夹/data/data/<package>/databases/创建一个students.db的数据库
  2. //该类返回一个SQLiteDatabase,对那个数据库操作,就要打开该数据库
  3. openOrCreateDatabase("students.db",SQLiteDatabase.CREATE_IF_NECESSARY,null);

(2.)删除一个数据库

  1. //在Context环境中,删除students.db,该方法返回一个boolean类型
  2. deleteDatabase("students.db");

(3.)获取应用程序所有数据库的名称

  1. //在Context环境中,获取该应用程序的所有数据库名称(即databases文件夹下的数据库文件)
  2. //该方法返回一个字符串数组
  3. databaseList()

(4.)重命名一个数据库

  1. //将数据库data.db重命名为renamedata.db
  2. Filef=getDatabasePath("data.db");
  3. FilerenameFile=getDatabasePath("renamedata.db");
  4. f.renameTo(renameFile);

2.对表的操作

(1.)创建一个表(sql语句中创建)

  1. mDb.execSQL("createtableifnotexists"+table+
  2. "(idintegerprimarykeyautoincrement,"
  3. +"usernametextnotnull,infotextnotnull);");

(2.)删除一个表

  1. mDb.execSQL("droptableifexists"+table);

(3.)修改表

Sqlite是不能修改一个表的字段,不能删除一个表的字段,但是可以重命名一个表的名称,可以添加一

个字段及其属性

1.)重命名表

  1. mDb.execSQL("altertable"+oldTable+"renameto"+newTableName+";");

2.)添加一列

  1. mDb.execSQL("altertable"+table+"addcolumn"+column+type+";");

(4.)获取一个数据库的所有表的名称

  1. mDb.rawQuery("selectnamefromsqlite_masterwheretype='table'orderbyname",null);

3.对数据库记录的操作

(1.)添加一条记录

  1. ContentValuesvalues=newContentValues();
  2. values.put("username",user.getUsername());
  3. values.put("info",user.getInfo());
  4. mDb.insert(table,null,values);

(2.)删除一条记录

  1. StringwhereClause="id=?";
  2. String[]whereArgs=newString[]{String.valueOf(id)};
  3. mDb.delete(table,whereClause,whereArgs);

(3.)修改一条记录

  1. ContentValuesvalues=newContentValues();
  2. values.put("username",username);
  3. values.put("info",info);
  4. StringwhereClause="id=?";
  5. String[]whereArgs=newString[]{String.valueOf(id)};
  6. mDb.update(table,values,whereClause,whereArgs);

(4.)查询一条数据

  1. String[]columns=newString[]{"id","username","info"};
  2. Stringselection="id=?";
  3. String[]selectionArgs={String.valueOf(id)};
  4. StringgroupBy=null;
  5. Stringhaving=null;
  6. StringorderBy=null;
  7. mDb.query(table,columns,selection,selectionArgs,groupBy,having,orderBy);

(5.)查询所有记录

  1. mDb.rawQuery("select*from"+table,null);

SqliteActivity源码类如下(注意:在点击对数据记录的增删改查时要先create table ,否则会因为无法找到mytable表而报错)

SqliteActivity.java

  1. packagecom.sqlite.main;
  2. importjava.io.File;
  3. importandroid.app.Activity;
  4. importandroid.content.ContentValues;
  5. importandroid.database.Cursor;
  6. importandroid.database.SQLException;
  7. importandroid.database.sqlite.SQLiteDatabase;
  8. importandroid.os.Bundle;
  9. importandroid.text.Html;
  10. importandroid.view.View;
  11. importandroid.view.View.OnClickListener;
  12. importandroid.widget.Button;
  13. importandroid.widget.TextView;
  14. importandroid.widget.Toast;
  15. publicclassSqliteActivityextendsActivity{
  16. /**Calledwhentheactivityisfirstcreated.*/
  17. //SQLiteDatabase引用
  18. SQLiteDatabasemDb;
  19. SQLiteDatabaseDaodao;
  20. //显示结果
  21. TextViewshow;
  22. @Override
  23. publicvoidonCreate(BundlesavedInstanceState){
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.main);
  26. //默认创建一个users.db的数据库
  27. dao=newSQLiteDatabaseDao();
  28. //创建一个数据库
  29. ButtoncreateDatabase=(Button)findViewById(R.id.createdatabase);
  30. createDatabase.setOnClickListener(createDatabaseClick);
  31. //获取所有数据库
  32. ButtongetDatabasesList=(Button)findViewById(R.id.getdatabaseslist);
  33. getDatabasesList.setOnClickListener(getDatabaseListClick);
  34. //重命名数据库
  35. ButtonrenameDatabase=(Button)findViewById(R.id.renamedatabase);
  36. renameDatabase.setOnClickListener(renameDatabaseClick);
  37. //删除一个数据库
  38. ButtonremoveDatabase=(Button)findViewById(R.id.removedatabase);
  39. removeDatabase.setOnClickListener(removeDatabaseClick);
  40. //创建一个表
  41. ButtoncreateTable=(Button)findViewById(R.id.createtable);
  42. createTable.setOnClickListener(createTableClick);
  43. //获取所有的表
  44. ButtongetTablesList=(Button)findViewById(R.id.gettableslist);
  45. getTablesList.setOnClickListener(getTablesListClick);
  46. //重命名一个表
  47. ButtonrenameTable=(Button)findViewById(R.id.renametable);
  48. renameTable.setOnClickListener(renameTableClick);
  49. //删除一个表
  50. ButtondropTable=(Button)findViewById(R.id.droptable);
  51. dropTable.setOnClickListener(dropTableClick);
  52. //为表添加一个字段
  53. ButtonaddTableColumn=(Button)findViewById(R.id.addtablecolumn);
  54. addTableColumn.setOnClickListener(addTableColumnClick);
  55. //获取表的所有列
  56. ButtongetTableColumnsList=(Button)findViewById(R.id.gettablecolumnslist);
  57. getTableColumnsList.setOnClickListener(getTableColumnsListClick);
  58. //插入一条数据
  59. ButtoninsertTable=(Button)findViewById(R.id.inserttable);
  60. insertTable.setOnClickListener(insertTableClick);
  61. //查询一条数据
  62. ButtonqueryTable=(Button)findViewById(R.id.querytable);
  63. queryTable.setOnClickListener(queryTableClick);
  64. //更新一条数据
  65. ButtonupdateTable=(Button)findViewById(R.id.updatetable);
  66. updateTable.setOnClickListener(updateTableClick);
  67. //删除一条数据
  68. Buttondelete=(Button)findViewById(R.id.delete);
  69. delete.setOnClickListener(deleteClick);
  70. //显示结果
  71. show=(TextView)findViewById(R.id.showresult);
  72. }
  73. /************对按钮事件进行操作的事件响应****************/
  74. //创建一个数据库
  75. OnClickListenercreateDatabaseClick=newOnClickListener(){
  76. @Override
  77. publicvoidonClick(Viewv){
  78. //TODOAuto-generatedmethodstub
  79. //创建一个名为students.db的数据库,主要是生成另外一个数据库以示区别
  80. openOrCreateDatabase("students.db",
  81. SQLiteDatabase.CREATE_IF_NECESSARY,null);
  82. show.setText("创建的数据库路径为\n"
  83. +getDatabasePath("students.db"));
  84. }
  85. };
  86. //创建一个应用程序数据库的个数(list)的事件响应
  87. OnClickListenergetDatabaseListClick=newOnClickListener(){
  88. @Override
  89. publicvoidonClick(Viewv){
  90. //TODOAuto-generatedmethodstub
  91. String[]dblist=dao.getDatabasesList();
  92. Stringrs="";
  93. for(Strings:dblist){
  94. rs+=s+"\n";
  95. }
  96. show.setText("数据库名称为:\n"+rs);
  97. }
  98. };
  99. //重命名一个数据库的事件响应
  100. OnClickListenerrenameDatabaseClick=newOnClickListener(){
  101. @Override
  102. publicvoidonClick(Viewv){
  103. //TODOAuto-generatedmethodstub
  104. //创建一个data.db的数据库,并命名为renamedata.db数据库
  105. openOrCreateDatabase("data.db",
  106. SQLiteDatabase.CREATE_IF_NECESSARY,null);
  107. Filef=getDatabasePath("data.db");
  108. FilerenameFile=getDatabasePath("renamedata.db");
  109. booleanb=f.renameTo(renameFile);
  110. if(b)
  111. show.setText("data.db已经重命名为renamedata.db");
  112. else
  113. show.setText("无法重命名");
  114. }
  115. };
  116. //删除一个数据库的事件响应
  117. OnClickListenerremoveDatabaseClick=newOnClickListener(){
  118. @Override
  119. publicvoidonClick(Viewv){
  120. //TODOAuto-generatedmethodstub
  121. //删除students.db数据库
  122. dao.dropDatabase("students.db");
  123. //重新获取数据库名称
  124. String[]dblist=dao.getDatabasesList();
  125. Stringrs="";
  126. for(Strings:dblist){
  127. rs+=s+"\n";
  128. }
  129. show.setText("数据库students.db已经删除\n现在数据库的名称为:\n"+rs);
  130. }
  131. };
  132. //创建一个表的事件响应
  133. OnClickListenercreateTableClick=newOnClickListener(){
  134. @Override
  135. publicvoidonClick(Viewv){
  136. //TODOAuto-generatedmethodstub
  137. //在user.db数据库中插入mytable表,并添加相应的字段
  138. dao.createTable(mDb,"mytable");
  139. show.setText("数据库students.db已经创建mytable表\n");
  140. }
  141. };
  142. //获取一个数据库的所有表个数(list)的事件响应
  143. OnClickListenergetTablesListClick=newOnClickListener(){
  144. @Override
  145. publicvoidonClick(Viewv){
  146. //TODOAuto-generatedmethodstub
  147. //显示所有的表的数据
  148. StringtableNames=dao.getTablesList(mDb);
  149. show.setText(tableNames);
  150. }
  151. };
  152. //重命名一个表的事件响应
  153. OnClickListenerrenameTableClick=newOnClickListener(){
  154. @Override
  155. publicvoidonClick(Viewv){
  156. //TODOAuto-generatedmethodstub
  157. //创建一个testtable的表
  158. dao.createTable(mDb,"testtable");
  159. //将testtable重命名为newtable
  160. booleanb=dao.alterTableRenameTable(mDb,"testtable","newtable");
  161. if(b)show.setText("testtable已经重命名为\nnewtable表\n");
  162. elseshow.setText("newtable已经存在\n请删除(droptable)后重试");
  163. }
  164. };
  165. //删除一个表的事件响应
  166. OnClickListenerdropTableClick=newOnClickListener(){
  167. @Override
  168. publicvoidonClick(Viewv){
  169. //TODOAuto-generatedmethodstub
  170. //删除newtable表
  171. dao.dropTable(mDb,"newtable");
  172. //显示所有的表的数据
  173. StringtableNames=dao.getTablesList(mDb);
  174. show.setText("newtable已经删除\n现在表名称为:\n"+tableNames);
  175. }
  176. };
  177. //修改一个表(给表添加一个字段)的事件响应
  178. OnClickListeneraddTableColumnClick=newOnClickListener(){
  179. @Override
  180. publicvoidonClick(Viewv){
  181. //TODOAuto-generatedmethodstub
  182. //默认添加一个password字段,类型为varchar,长度为30
  183. booleanb=dao.alterTableAddColumn(mDb,"mytable","password","varchar(30)");
  184. if(b)show.setText("已经添加password字段\n字符类型为:varchar\n长度为:30");
  185. elseshow.setText("mytable表中password字段已经存在");
  186. }
  187. };
  188. //获取一个表的所有列的名称事件响应
  189. OnClickListenergetTableColumnsListClick=newOnClickListener(){
  190. @Override
  191. publicvoidonClick(Viewv){
  192. //TODOAuto-generatedmethodstub
  193. Stringstr=dao.getTableColumns(mDb);
  194. show.setText("mytable表的列名:\n"+str);
  195. }
  196. };
  197. //对一个表添加一个数据的事件响应
  198. OnClickListenerinsertTableClick=newOnClickListener(){
  199. @Override
  200. publicvoidonClick(Viewv){
  201. //TODOAuto-generatedmethodstub
  202. Useruser=newUser();
  203. user.setUsername("Mr.Young");
  204. user.setInfo("好学生");
  205. dao.insert(mDb,"mytable",user);
  206. Cursorc=dao.getAllData(mDb,"mytable");
  207. if(c.moveToLast()){
  208. Stringid=c.getString(0);
  209. Stringusername=c.getString(1);
  210. Stringinfo=c.getString(2);
  211. show.setText("最新添加的一条数据:\n"+"id:"+id+"\nusername:"+username+"\ninfo:"+info);
  212. }
  213. }
  214. };
  215. //查询一个表的所有数据记录的事件响应
  216. OnClickListenerqueryTableClick=newOnClickListener(){
  217. @Override
  218. publicvoidonClick(Viewv){
  219. //TODOAuto-generatedmethodstub
  220. //默认查询mytable所有数据
  221. Cursorc=dao.getAllData(mDb,"mytable");
  222. Strings="";
  223. intcolumnsSize=c.getColumnCount();
  224. String[]columns=c.getColumnNames();
  225. StringcolumnsName="";
  226. //获取表头
  227. for(Stringcol:columns){
  228. columnsName+=col+"\u0020\u0020";
  229. }
  230. //获取表的内容
  231. while(c.moveToNext()){
  232. for(inti=0;i<columnsSize;i++){
  233. s+=c.getString(i)+"\u0020\u0020";
  234. }
  235. s+="<br>";
  236. }
  237. show.setText(Html.fromHtml("<h5>"+columnsName+"</h5>"+s));
  238. }
  239. };
  240. //更新一个表的数据的事件响应
  241. OnClickListenerupdateTableClick=newOnClickListener(){
  242. @Override
  243. publicvoidonClick(Viewv){
  244. //TODOAuto-generatedmethodstub
  245. Cursorc=dao.getAllData(mDb,"mytable");
  246. if(c.moveToFirst()){
  247. intfirst=Integer.valueOf(c.getString(0));
  248. //默认修改第一条记录
  249. dao.update(mDb,"mytable",first,"YongMing","学习成绩优异");
  250. Cursoru=dao.queryById(mDb,"mytable",first);
  251. u.moveToFirst();
  252. show.setText("id为:"+first+"的记录已经修改:\nid:"+first+"\nusername:"+u.getString(1)+"\ninfo:"+u.getString(2));
  253. }else
  254. show.setText("没有要更新的记录!请添加数据后再作修改");
  255. }
  256. };
  257. //删除一个表的一条数据的事件响应
  258. OnClickListenerdeleteClick=newOnClickListener(){
  259. @Override
  260. publicvoidonClick(Viewv){
  261. //TODOAuto-generatedmethodstub
  262. Cursorc=dao.getAllData(mDb,"mytable");
  263. if(c.moveToLast()){
  264. intlast=Integer.valueOf(c.getString(0));
  265. //默认删除最后一条记录
  266. booleanb=dao.delete(mDb,"mytable",last);
  267. if(b)
  268. show.setText("成功删除id为:\n"+last+"的记录!");
  269. }
  270. else
  271. show.setText("没有要删除的记录!");
  272. }
  273. };
  274. //退出时关闭数据库
  275. @Override
  276. publicvoidfinish(){
  277. //TODOAuto-generatedmethodstub
  278. super.finish();
  279. mDb.close();
  280. }
  281. /*******************
  282. *
  283. *
  284. *
  285. *对Sqlite数据库进行操作的类
  286. *
  287. *
  288. *
  289. *****************/
  290. classSQLiteDatabaseDao{
  291. publicSQLiteDatabaseDao(){
  292. mDb=openOrCreateDatabase("users.db",
  293. SQLiteDatabase.CREATE_IF_NECESSARY,null);
  294. }
  295. /************对数据库的操作***********************/
  296. //获取所有数据库的名称
  297. publicString[]getDatabasesList(){
  298. returndatabaseList();
  299. }
  300. //创建一个数据库
  301. publicvoidcreateDatabase(Stringdb){
  302. openOrCreateDatabase(db,SQLiteDatabase.CREATE_IF_NECESSARY,null);
  303. }
  304. //删除一个数据库
  305. publicvoiddropDatabase(Stringdb){
  306. try{
  307. deleteDatabase(db);
  308. }catch(SQLExceptione){
  309. Toast.makeText(getApplicationContext(),"删除数据库失败",
  310. Toast.LENGTH_LONG).show();
  311. }
  312. }
  313. /************对数据库的表的属性添加修改操作***********************/
  314. //获取某个数据库的表的名称
  315. publicStringgetTablesList(SQLiteDatabasemDb){
  316. Cursorc=mDb
  317. .rawQuery(
  318. "selectnamefromsqlite_masterwheretype='table'orderbyname",
  319. null);
  320. Stringstr="";
  321. while(c.moveToNext()){
  322. str+=c.getString(0)+"\n";
  323. }
  324. return"表的名称为:\n"+str;
  325. }
  326. //创建一个表,默认创建一个usernameinfo字段的表,可以在后面的代码中添加相应的列
  327. publicvoidcreateTable(SQLiteDatabasemDb,Stringtable){
  328. try{
  329. mDb.execSQL("createtableifnotexists"+table+
  330. "(idintegerprimarykeyautoincrement,"
  331. +"usernametextnotnull,infotextnotnull);");
  332. }catch(SQLExceptione){
  333. Toast.makeText(getApplicationContext(),"数据表创建失败",
  334. Toast.LENGTH_LONG).show();
  335. }
  336. }
  337. //删除一个表
  338. publicvoiddropTable(SQLiteDatabasemDb,Stringtable){
  339. try{
  340. mDb.execSQL("droptableifexists"+table);
  341. }catch(SQLExceptione){
  342. Toast.makeText(getApplicationContext(),"数据表删除失败",
  343. Toast.LENGTH_LONG).show();
  344. }
  345. }
  346. //修改表--重命名表名
  347. publicbooleanalterTableRenameTable(SQLiteDatabasemDb,StringoldTable,
  348. StringnewTableName){
  349. try{
  350. mDb.execSQL("altertable"+oldTable+"renameto"
  351. +newTableName+";");
  352. }catch(SQLExceptione){
  353. Toast.makeText(getApplicationContext(),"数据表重命名失败",
  354. Toast.LENGTH_LONG).show();
  355. returnfalse;
  356. }
  357. returntrue;
  358. }
  359. //修改表--添加一列
  360. //@table需要修改的table名
  361. //@column添加的列的名称
  362. //@type列的类型,如text,varchar等
  363. publicbooleanalterTableAddColumn(SQLiteDatabasemDb,Stringtable,
  364. Stringcolumn,Stringtype){
  365. try{
  366. mDb.execSQL("altertable"+table+"addcolumn"+column
  367. +type+";");
  368. }catch(SQLExceptione){
  369. Toast.makeText(getApplicationContext(),"数据表添加失败",
  370. Toast.LENGTH_LONG).show();
  371. returnfalse;
  372. }
  373. returntrue;
  374. }
  375. //获取表的列的名称
  376. publicStringgetTableColumns(SQLiteDatabasemDb){
  377. Cursorc=dao.getAllData(mDb,"mytable");;
  378. String[]columns=c.getColumnNames();
  379. Stringstr="";
  380. for(Strings:columns){
  381. str+=s+"\n";
  382. }
  383. returnstr;
  384. }
  385. /************对数据库的表数据增删改查操作***********************/
  386. //添加一条数据,默认只向username和info字段添加数据
  387. publiclonginsert(SQLiteDatabasemDb,Stringtable,Useruser){
  388. ContentValuesvalues=newContentValues();
  389. values.put("username",user.getUsername());
  390. values.put("info",user.getInfo());
  391. returnmDb.insert(table,null,values);
  392. }
  393. /*
  394. *
  395. *删除一条数据
  396. */
  397. publicbooleandelete(SQLiteDatabasemDb,Stringtable,intid){
  398. StringwhereClause="id=?";
  399. String[]whereArgs=newString[]{String.valueOf(id)};
  400. try{
  401. mDb.delete(table,whereClause,whereArgs);
  402. }catch(SQLExceptione){
  403. Toast.makeText(getApplicationContext(),"删除数据库失败",
  404. Toast.LENGTH_LONG).show();
  405. returnfalse;
  406. }
  407. returntrue;
  408. }
  409. /*
  410. *
  411. *修改一条数据
  412. */
  413. publicvoidupdate(SQLiteDatabasemDb,Stringtable,intid,Stringusername,Stringinfo)
  414. {
  415. ContentValuesvalues=newContentValues();
  416. values.put("username",username);
  417. values.put("info",info);
  418. StringwhereClause="id=?";
  419. String[]whereArgs=newString[]{String.valueOf(id)};
  420. mDb.update(table,values,whereClause,whereArgs);
  421. }
  422. publicCursorqueryById(SQLiteDatabasemDb,Stringtable,intid){
  423. //第一个参数String:表名
  424. //第二个参数String[]:要查询的列名
  425. //第三个参数String:查询条件
  426. //第四个参数String[]:查询条件的参数
  427. //第五个参数String:对查询的结果进行分组
  428. //第六个参数String:对分组的结果进行限制
  429. //第七个参数String:对查询的结果进行排序
  430. String[]columns=newString[]{"id","username","info"};
  431. Stringselection="id=?";
  432. String[]selectionArgs={String.valueOf(id)};
  433. StringgroupBy=null;
  434. Stringhaving=null;
  435. StringorderBy=null;
  436. returnmDb.query(table,columns,selection,
  437. selectionArgs,groupBy,having,orderBy);
  438. }
  439. publicCursorgetAllData(SQLiteDatabasemDb,Stringtable){
  440. //遍历表所有数据
  441. returnmDb.rawQuery("select*from"+table,null);
  442. /**如果需要返回指定的列,则执行以下语句
  443. String[]columns=newString[]{"id","username","info"};
  444. //调用SQLiteDatabase类的query函数查询记录
  445. returnmDb.query(table,columns,null,null,null,null,
  446. null);
  447. */
  448. }
  449. }
  450. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics