Android Sqlite数据库执行插入查询更新删除的操作对比

下面是在Android4.0上,利用Sqlite数据库的insert,query,update,delete函数以及execSql,rawQuery函数执行插入,查询,更新,删除操作花费时间的对比结果。

是在执行相同的动作,记录条数也一样的情况下的对比,多次验证的结果是:

(1)如果批量执行的记录数在1000条,则Android SqliteDatabase提供的insert,query,update,delete函数和直接写SQL文的execSql,rawQuery的效率差不多,几乎一样。所以使用哪种放到都可以,不会影响到执行效率。

(2)如果批量执行的记录数在10万条,则会存在差别。在某台手机上SqliteDatabase提供的insert执行插入操作耗时45秒,要比execSql插入35秒慢10秒左右。

可见在数据库大的情况下,还是有差别的。execSql省去了拼接sql语句的步骤,要比SqliteDatabase提供的insert,query,update,delete等函数效率高。当数据库越大,差别也越大。

下面是验证代码:

[java] view plaincopy

  1. public class MainActivity extends Activity {
  2. private static final String TAG = "MainActivity";
  3. private DBHelper mDbHelper = null;
  4. private static TextView mTvInfo;
  5. private static ProgressDialog mDialog = null;
  6. private static Handler mHandler = new Handler() {
  7. @Override
  8. public void handleMessage(Message msg) {
  9. // TODO Auto-generated method stub
  10. if(mDialog != null) {
  11. mDialog.dismiss();
  12. mDialog = null;
  13. }
  14. if (msg.what == 0) {
  15. Bundle b = msg.getData();
  16. int seconds = b.getInt("seconds");
  17. int ms = b.getInt("ms");
  18. StringBuilder builder = new StringBuilder("insert插入1000条记录花费时间:");
  19. if (seconds > 0) {
  20. builder.append(seconds).append("s ");
  21. }
  22. builder.append(ms).append("ms");
  23. String strLines[] = mTvInfo.getText().toString().split("\n");
  24. // 最多显示8条信息
  25. for (int i = 0; i < strLines.length; i++) {
  26. builder.append(‘\n‘).append(strLines[i]);
  27. if (i == 6) {
  28. break; // 加上原来最多7条信息,共显示8条信息
  29. }
  30. }
  31. mTvInfo.setText(builder.toString());
  32. } else if (msg.what == 1) {
  33. Bundle b = msg.getData();
  34. int seconds = b.getInt("seconds");
  35. int ms = b.getInt("ms");
  36. StringBuilder builder = new StringBuilder("execSql插入1000条记录花费时间:");
  37. if (seconds > 0) {
  38. builder.append(seconds).append("s ");
  39. }
  40. builder.append(ms).append("ms");
  41. String strLines[] = mTvInfo.getText().toString().split("\n");
  42. // 最多显示8条信息
  43. for (int i = 0; i < strLines.length; i++) {
  44. builder.append(‘\n‘).append(strLines[i]);
  45. if (i == 6) {
  46. break; // 加上原来最多7条信息,共显示8条信息
  47. }
  48. }
  49. mTvInfo.setText(builder.toString());
  50. } else if (msg.what == 10) {
  51. Bundle b = msg.getData();
  52. int count = b.getInt("count");
  53. int seconds = b.getInt("seconds");
  54. int ms = b.getInt("ms");
  55. StringBuilder builder = new StringBuilder("query查询");
  56. builder.append(count).append("条记录花费时间:");
  57. if (seconds > 0) {
  58. builder.append(seconds).append("s ");
  59. }
  60. builder.append(ms).append("ms");
  61. String strLines[] = mTvInfo.getText().toString().split("\n");
  62. // 最多显示8条信息
  63. for (int i = 0; i < strLines.length; i++) {
  64. builder.append(‘\n‘).append(strLines[i]);
  65. if (i == 6) {
  66. break; // 加上原来最多7条信息,共显示8条信息
  67. }
  68. }
  69. mTvInfo.setText(builder.toString());
  70. } else if (msg.what == 11) {
  71. Bundle b = msg.getData();
  72. int count = b.getInt("count");
  73. int seconds = b.getInt("seconds");
  74. int ms = b.getInt("ms");
  75. StringBuilder builder = new StringBuilder("rawQuery查询");
  76. builder.append(count).append("条记录花费时间:");
  77. if (seconds > 0) {
  78. builder.append(seconds).append("s ");
  79. }
  80. builder.append(ms).append("ms");
  81. String strLines[] = mTvInfo.getText().toString().split("\n");
  82. // 最多显示8条信息
  83. for (int i = 0; i < strLines.length; i++) {
  84. builder.append(‘\n‘).append(strLines[i]);
  85. if (i == 6) {
  86. break; // 加上原来最多7条信息,共显示8条信息
  87. }
  88. }
  89. mTvInfo.setText(builder.toString());
  90. } else if (msg.what == 20) {
  91. Bundle b = msg.getData();
  92. int count = b.getInt("count");
  93. int seconds = b.getInt("seconds");
  94. int ms = b.getInt("ms");
  95. StringBuilder builder = new StringBuilder("update更新");
  96. builder.append(count).append("条记录花费时间:");
  97. if (seconds > 0) {
  98. builder.append(seconds).append("s ");
  99. }
  100. builder.append(ms).append("ms");
  101. String strLines[] = mTvInfo.getText().toString().split("\n");
  102. // 最多显示8条信息
  103. for (int i = 0; i < strLines.length; i++) {
  104. builder.append(‘\n‘).append(strLines[i]);
  105. if (i == 6) {
  106. break; // 加上原来最多7条信息,共显示8条信息
  107. }
  108. }
  109. mTvInfo.setText(builder.toString());
  110. } else if (msg.what == 21) {
  111. Bundle b = msg.getData();
  112. int seconds = b.getInt("seconds");
  113. int ms = b.getInt("ms");
  114. StringBuilder builder = new StringBuilder("execSql更新1000条记录花费时间:");
  115. if (seconds > 0) {
  116. builder.append(seconds).append("s ");
  117. }
  118. builder.append(ms).append("ms");
  119. String strLines[] = mTvInfo.getText().toString().split("\n");
  120. // 最多显示8条信息
  121. for (int i = 0; i < strLines.length; i++) {
  122. builder.append(‘\n‘).append(strLines[i]);
  123. if (i == 6) {
  124. break; // 加上原来最多7条信息,共显示8条信息
  125. }
  126. }
  127. mTvInfo.setText(builder.toString());
  128. } else if (msg.what == 30) {
  129. Bundle b = msg.getData();
  130. int count = b.getInt("count");
  131. int seconds = b.getInt("seconds");
  132. int ms = b.getInt("ms");
  133. StringBuilder builder = new StringBuilder("delete删除");
  134. builder.append(count).append("条记录花费时间:");
  135. if (seconds > 0) {
  136. builder.append(seconds).append("s ");
  137. }
  138. builder.append(ms).append("ms");
  139. String strLines[] = mTvInfo.getText().toString().split("\n");
  140. // 最多显示8条信息
  141. for (int i = 0; i < strLines.length; i++) {
  142. builder.append(‘\n‘).append(strLines[i]);
  143. if (i == 6) {
  144. break; // 加上原来最多7条信息,共显示8条信息
  145. }
  146. }
  147. mTvInfo.setText(builder.toString());
  148. } else if (msg.what == 31) {
  149. Bundle b = msg.getData();
  150. int seconds = b.getInt("seconds");
  151. int ms = b.getInt("ms");
  152. StringBuilder builder = new StringBuilder("execSql删除1000条记录花费时间:");
  153. if (seconds > 0) {
  154. builder.append(seconds).append("s ");
  155. }
  156. builder.append(ms).append("ms");
  157. String strLines[] = mTvInfo.getText().toString().split("\n");
  158. // 最多显示8条信息
  159. for (int i = 0; i < strLines.length; i++) {
  160. builder.append(‘\n‘).append(strLines[i]);
  161. if (i == 6) {
  162. break; // 加上原来最多7条信息,共显示8条信息
  163. }
  164. }
  165. mTvInfo.setText(builder.toString());
  166. }
  167. }
  168. };
  169. @Override
  170. public void onCreate(Bundle savedInstanceState) {
  171. super.onCreate(savedInstanceState);
  172. setContentView(R.layout.activity_main);
  173. Button btnCreateDb = (Button)findViewById(R.id.btnCreateDb);
  174. btnCreateDb.setOnClickListener(new OnClickListener() {
  175. @Override
  176. public void onClick(View arg0) {
  177. // TODO Auto-generated method stub
  178. mDbHelper = new DBHelper(MainActivity.this, "test", null, 1);
  179. }
  180. });
  181. // insert插入
  182. Button btnInsert = (Button)findViewById(R.id.btnInsert);
  183. btnInsert.setOnClickListener(new OnClickListener() {
  184. @Override
  185. public void onClick(View arg0) {
  186. // TODO Auto-generated method stub
  187. if (mDbHelper != null) {
  188. mDialog = ProgressDialog.show(MainActivity.this, "insert插入", "正在插入1000条记录,请稍等……", true);
  189. new Thread() { // 开启线程执行防止阻塞
  190. @Override
  191. public void run() {
  192. SQLiteDatabase db = mDbHelper.getWritableDatabase();
  193. try {
  194. // 利用事物批量插入数据以提高效率
  195. ContentValues values = new ContentValues();
  196. long startms = System.currentTimeMillis();
  197. db.beginTransaction();
  198. for (int i = 0; i < 1000; i++) {
  199. values.put("name", new String("张三") + i);
  200. values.put("birthday", "2012-12-08");
  201. values.put("gender", i%2);
  202. db.insert("student", null, values);
  203. }
  204. db.setTransactionSuccessful();
  205. db.endTransaction();
  206. long endms = System.currentTimeMillis();
  207. int seconds = (int)((endms - startms)/1000);
  208. int ms = (int)((endms - startms)%1000);
  209. Message msg = new Message();
  210. msg.what = 0;
  211. // 使用bundle对象来传递数据
  212. Bundle b = new Bundle();
  213. if(seconds > 0) {
  214. b.putInt("seconds", seconds);
  215. }
  216. b.putInt("ms", ms);
  217. msg.setData(b);
  218. mHandler.sendMessage(msg);
  219. } catch(Exception e) {
  220. e.printStackTrace();
  221. } finally {
  222. db.close(); // 关闭数据库
  223. }
  224. }
  225. }.start();
  226. } else {
  227. Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
  228. }
  229. }
  230. });
  231. // execSQL插入
  232. Button btnExecSqlInsert = (Button)findViewById(R.id.btnExecSqlInsert);
  233. btnExecSqlInsert.setOnClickListener(new OnClickListener() {
  234. @Override
  235. public void onClick(View arg0) {
  236. // TODO Auto-generated method stub
  237. if (mDbHelper != null) {
  238. mDialog = ProgressDialog.show(MainActivity.this, "execSQL插入", "正在插入1000条记录,请稍等……", true);
  239. new Thread() { // 开启线程执行防止阻塞
  240. @Override
  241. public void run() {
  242. SQLiteDatabase db = mDbHelper.getWritableDatabase();
  243. try {
  244. // 利用事物批量插入数据以提高效率
  245. long startms = System.currentTimeMillis();
  246. db.beginTransaction();
  247. for (int i = 0; i < 1000; i++) {
  248. db.execSQL("INSERT INTO student(name, birthday, gender) values(?, ?, ?)" ,
  249. new Object[]{new String("李四" + i), "2012-12-08", i%2});
  250. }
  251. db.setTransactionSuccessful();
  252. db.endTransaction();
  253. long endms = System.currentTimeMillis();
  254. int seconds = (int)((endms - startms)/1000);
  255. int ms = (int)((endms - startms)%1000);
  256. Message msg = new Message();
  257. msg.what = 1;
  258. // 使用bundle对象来传递数据
  259. Bundle b = new Bundle();
  260. if(seconds > 0) {
  261. b.putInt("seconds", seconds);
  262. }
  263. b.putInt("ms", ms);
  264. msg.setData(b);
  265. mHandler.sendMessage(msg);
  266. } catch(Exception e) {
  267. e.printStackTrace();
  268. } finally {
  269. db.close(); // 关闭数据库
  270. }
  271. }
  272. }.start();
  273. }else {
  274. Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
  275. }
  276. }
  277. });
  278. // query查询
  279. Button btnQuery = (Button)findViewById(R.id.btnQuery);
  280. btnQuery.setOnClickListener(new OnClickListener() {
  281. @Override
  282. public void onClick(View arg0) {
  283. // TODO Auto-generated method stub
  284. if (mDbHelper != null) {
  285. mDialog = ProgressDialog.show(MainActivity.this, "query查询", "正在查询记录,请稍等……", true);
  286. new Thread() { // 开启线程执行防止阻塞
  287. @Override
  288. public void run() {
  289. SQLiteDatabase db = mDbHelper.getWritableDatabase();
  290. try {
  291. Log.d(TAG, "query Start:" + getDate());
  292. long startms = System.currentTimeMillis();
  293. // 查询所有记录
  294. Cursor c = db.query("student", null, null, null, null, null, new String("id ASC LIMIT 0,1000"));
  295. Log.d(TAG, "query End:" + getDate());
  296. long endms = System.currentTimeMillis();
  297. int seconds = (int)((endms - startms)/1000);
  298. int ms = (int)((endms - startms)%1000);
  299. if (c != null) {
  300. Message msg = new Message();
  301. msg.what = 10;
  302. // 使用bundle对象来传递数据
  303. Bundle b = new Bundle();
  304. b.putInt("count", c.getCount());
  305. if(seconds > 0) {
  306. b.putInt("seconds", seconds);
  307. }
  308. b.putInt("ms", ms);
  309. msg.setData(b);
  310. mHandler.sendMessage(msg);
  311. c.close();
  312. }
  313. } catch(Exception e) {
  314. e.printStackTrace();
  315. } finally {
  316. db.close(); // 关闭数据库
  317. }
  318. }
  319. }.start();
  320. }else {
  321. Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
  322. }
  323. }
  324. });
  325. // rawQuery查询
  326. Button btnRawQuery = (Button)findViewById(R.id.btnRawQuery);
  327. btnRawQuery.setOnClickListener(new OnClickListener() {
  328. @Override
  329. public void onClick(View arg0) {
  330. // TODO Auto-generated method stub
  331. if (mDbHelper != null) {
  332. mDialog = ProgressDialog.show(MainActivity.this, "rawQuery查询", "正在查询记录,请稍等……", true);
  333. new Thread() { // 开启线程执行防止阻塞
  334. @Override
  335. public void run() {
  336. SQLiteDatabase db = mDbHelper.getWritableDatabase();
  337. try {
  338. Log.d(TAG, "rawQuery Start:" + getDate());
  339. long startms = System.currentTimeMillis();
  340. // 查询所有记录
  341. Cursor c = db.rawQuery("SELECT * FROM student ORDER BY id ASC LIMIT 0,1000", null);
  342. Log.d(TAG, "rawQuery End:" + getDate());
  343. long endms = System.currentTimeMillis();
  344. int seconds = (int)((endms - startms)/1000);
  345. int ms = (int)((endms - startms)%1000);
  346. if (c != null) {
  347. Message msg = new Message();
  348. msg.what = 11;
  349. // 使用bundle对象来传递数据
  350. Bundle b = new Bundle();
  351. b.putInt("count", c.getCount());
  352. if(seconds > 0) {
  353. b.putInt("seconds", seconds);
  354. }
  355. b.putInt("ms", ms);
  356. msg.setData(b);
  357. mHandler.sendMessage(msg);
  358. c.close();
  359. }
  360. } catch(Exception e) {
  361. e.printStackTrace();
  362. } finally {
  363. db.close(); // 关闭数据库
  364. }
  365. }
  366. }.start();
  367. } else {
  368. Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
  369. }
  370. }
  371. });
  372. // update更新
  373. Button btnUpdate = (Button)findViewById(R.id.btnUpdate);
  374. btnUpdate.setOnClickListener(new OnClickListener() {
  375. @Override
  376. public void onClick(View arg0) {
  377. // TODO Auto-generated method stub
  378. if (mDbHelper != null) {
  379. mDialog = ProgressDialog.show(MainActivity.this, "update更新", "正在更新1000条记录,请稍等……", true);
  380. new Thread() { // 开启线程执行防止阻塞
  381. @Override
  382. public void run() {
  383. SQLiteDatabase db = mDbHelper.getWritableDatabase();
  384. try {
  385. ContentValues values = new ContentValues();
  386. long startms = System.currentTimeMillis();
  387. values.put("name", new String("王五"));
  388. values.put("birthday", "2012-12-09");
  389. values.put("gender", 0);
  390. int count = db.update("student", values, new String("id IN (SELECT id FROM student ORDER BY id ASC LIMIT 0,1000)"), null);
  391. long endms = System.currentTimeMillis();
  392. int seconds = (int)((endms - startms)/1000);
  393. int ms = (int)((endms - startms)%1000);
  394. Message msg = new Message();
  395. msg.what = 20;
  396. // 使用bundle对象来传递数据
  397. Bundle b = new Bundle();
  398. b.putInt("count", count);
  399. if(seconds > 0) {
  400. b.putInt("seconds", seconds);
  401. }
  402. b.putInt("ms", ms);
  403. msg.setData(b);
  404. mHandler.sendMessage(msg);
  405. } catch(Exception e) {
  406. e.printStackTrace();
  407. } finally {
  408. db.close(); // 关闭数据库
  409. }
  410. }
  411. }.start();
  412. } else {
  413. Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
  414. }
  415. }
  416. });
  417. // execSQL更新
  418. Button btnExecSqlUpdate = (Button)findViewById(R.id.btnExecSqlUpdate);
  419. btnExecSqlUpdate.setOnClickListener(new OnClickListener() {
  420. @Override
  421. public void onClick(View arg0) {
  422. // TODO Auto-generated method stub
  423. if (mDbHelper != null) {
  424. mDialog = ProgressDialog.show(MainActivity.this, "execSQL更新", "正在更新1000条记录,请稍等……", true);
  425. new Thread() { // 开启线程执行防止阻塞
  426. @Override
  427. public void run() {
  428. SQLiteDatabase db = mDbHelper.getWritableDatabase();
  429. try {
  430. long startms = System.currentTimeMillis();
  431. db.execSQL("UPDATE student SET name = ?, birthday = ?, gender = ? WHERE id IN (SELECT id FROM student ORDER BY id ASC LIMIT 0,1000)" ,
  432. new Object[]{new String("马六"), "2012-12-10", 1});
  433. long endms = System.currentTimeMillis();
  434. int seconds = (int)((endms - startms)/1000);
  435. int ms = (int)((endms - startms)%1000);
  436. Message msg = new Message();
  437. msg.what = 21;
  438. // 使用bundle对象来传递数据
  439. Bundle b = new Bundle();
  440. if(seconds > 0) {
  441. b.putInt("seconds", seconds);
  442. }
  443. b.putInt("ms", ms);
  444. msg.setData(b);
  445. mHandler.sendMessage(msg);
  446. } catch(Exception e) {
  447. e.printStackTrace();
  448. } finally {
  449. db.close(); // 关闭数据库
  450. }
  451. }
  452. }.start();
  453. }else {
  454. Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
  455. }
  456. }
  457. });
  458. // delete删除
  459. Button btnDelete = (Button)findViewById(R.id.btnDelete);
  460. btnDelete.setOnClickListener(new OnClickListener() {
  461. @Override
  462. public void onClick(View arg0) {
  463. // TODO Auto-generated method stub
  464. if (mDbHelper != null) {
  465. mDialog = ProgressDialog.show(MainActivity.this, "delete删除", "正在删除1000条记录,请稍等……", true);
  466. new Thread() { // 开启线程执行防止阻塞
  467. @Override
  468. public void run() {
  469. SQLiteDatabase db = mDbHelper.getWritableDatabase();
  470. try {
  471. long startms = System.currentTimeMillis();
  472. int count = db.delete("student", new String("id IN (SELECT id FROM student ORDER BY id ASC LIMIT 0,1000)"), null);
  473. long endms = System.currentTimeMillis();
  474. int seconds = (int)((endms - startms)/1000);
  475. int ms = (int)((endms - startms)%1000);
  476. Message msg = new Message();
  477. msg.what = 30;
  478. // 使用bundle对象来传递数据
  479. Bundle b = new Bundle();
  480. b.putInt("count", count);
  481. if(seconds > 0) {
  482. b.putInt("seconds", seconds);
  483. }
  484. b.putInt("ms", ms);
  485. msg.setData(b);
  486. mHandler.sendMessage(msg);
  487. } catch(Exception e) {
  488. e.printStackTrace();
  489. } finally {
  490. db.close(); // 关闭数据库
  491. }
  492. }
  493. }.start();
  494. } else {
  495. Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
  496. }
  497. }
  498. });
  499. // execSQL删除
  500. Button btnExecSqlDelete = (Button)findViewById(R.id.btnExecSqlDelete);
  501. btnExecSqlDelete.setOnClickListener(new OnClickListener() {
  502. @Override
  503. public void onClick(View arg0) {
  504. // TODO Auto-generated method stub
  505. if (mDbHelper != null) {
  506. mDialog = ProgressDialog.show(MainActivity.this, "execSQL删除", "正在删除1000条记录,请稍等……", true);
  507. new Thread() { // 开启线程执行防止阻塞
  508. @Override
  509. public void run() {
  510. SQLiteDatabase db = mDbHelper.getWritableDatabase();
  511. try {
  512. long startms = System.currentTimeMillis();
  513. db.execSQL("DELETE FROM student WHERE id IN (SELECT id FROM student ORDER BY id ASC LIMIT 0,1000)");
  514. long endms = System.currentTimeMillis();
  515. int seconds = (int)((endms - startms)/1000);
  516. int ms = (int)((endms - startms)%1000);
  517. Message msg = new Message();
  518. msg.what = 31;
  519. // 使用bundle对象来传递数据
  520. Bundle b = new Bundle();
  521. if(seconds > 0) {
  522. b.putInt("seconds", seconds);
  523. }
  524. b.putInt("ms", ms);
  525. msg.setData(b);
  526. mHandler.sendMessage(msg);
  527. } catch(Exception e) {
  528. e.printStackTrace();
  529. } finally {
  530. db.close(); // 关闭数据库
  531. }
  532. }
  533. }.start();
  534. }else {
  535. Toast.makeText(MainActivity.this, "请先创建数据库!", Toast.LENGTH_SHORT).show();
  536. }
  537. }
  538. });
  539. mTvInfo = (TextView)findViewById(R.id.tvInfo);
  540. }
  541. @Override
  542. public boolean onCreateOptionsMenu(Menu menu) {
  543. getMenuInflater().inflate(R.menu.activity_main, menu);
  544. return true;
  545. }
  546. /**
  547. * 获取系统时间
  548. * @return
  549. */
  550. public static String getDate(){
  551. Calendar ca = Calendar.getInstance();
  552. int year = ca.get(Calendar.YEAR);           // 获取年份
  553. int month = ca.get(Calendar.MONTH);         // 获取月份
  554. int day = ca.get(Calendar.DATE);            // 获取日
  555. int minute = ca.get(Calendar.MINUTE);       // 分
  556. int hour = ca.get(Calendar.HOUR);           // 小时
  557. int second = ca.get(Calendar.SECOND);       // 秒
  558. int millisecond = ca.get(Calendar.MILLISECOND); // 毫秒
  559. String date = year + "/" + (month + 1 )+ "/" + day + " "+ hour + ":" + minute + ":" + second + ":" + millisecond;
  560. return date;
  561. }
  562. }

执行效果图:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 11:04:45

Android Sqlite数据库执行插入查询更新删除的操作对比的相关文章

42.QT-QSqlQuery类操作SQLite数据库(创建、查询、删除、修改)详解

Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作.这里我们所说的“平台 独立”,既包括操作系统平台,也包括各个数据库平台,Qt支持以下几种数据库: QT自带SQLITE数据库,不需要再安装 QTDS在Qt4.7起已经被移除 1.QtSql 要使用QtSql 模块的话,需要在.pro文件中添加这么一句: QT += sql  2.QSqlDatabase QSqlDatabase类提供了一个接口,用于通过连接访问数据.QSqlDatabase的一个实例表示连接.该连接通过受

以编程的方式使用SQLite数据库 执行CRUD(创建 读取 更新 删除)操作

DBAdapter数据库辅助类 package com.databses; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.s

php+mysqli实现批量执行插入、更新及删除数据的方法

本文实例讲述了php+mysqli实现批量执行插入.更新及删除数据的方法.分享给大家供大家参考.具体如下: mysqli批量执行插入/更新/删除数据,函数为 multi_query(). 下面的代码只是批量插入数据,事实上,插入数据.更新数据.删除数据等可以混合一起执行.查询时使用该函数,读取数据有点不太一样,具体参考如下代码: <?php //1.创建数据库连接对象 $mysqli = new MySQLi("localhost","root","

Android SQLite数据库操作示例

SQLite介绍 SQLite是一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能.此外,它还是开源的,任何人都可以使用它. SQLite由以下几个组件组成:SQL编译器.内核.后端以及附件.SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试.修改和扩展SQLite的内核变得更加方便. SQLite支持的数据类型参考链接:http://blog.csdn.net/wzy_1988/article/details/36005947 Android在运行时(

在sqlite中执行&#39;in&#39;查询操作,如何使用selectionargs匹配多个值

在安卓开发中,经常使用到sqlite作为本地持久化存储的解决方案.在androidSDK中,已经为我们提供了各种各样的增.删.改.查的api,尽管我们可以自己写sql语句然后执行db.rawsql(sql,null)方法,但这种方法有一些风险,那就是拼接的关键字有可能是非法的,这样会造成很多意想不到并且很危险的后果.因此,建议使用sdk提供的api来做数据库操作,android已经为我们屏蔽了这一层风险. 在使用sqlite查询时,我们经常会使用"in"操作符来进行查询,如 selec

Android Sqlite数据库加密

Android使用的是开源的SQLite数据库,数据库本身没有加密,加密思路通常有两个: 1. 对几个关键的字段使用加密算法,再存入数据库 2. 对整个数据库进行加密 SQLite数据库加密工具: 收费工具: SSE(SQLite Encryption Extension) 免费工具: SQLCipher SQLCipher使用: SQLCipher是完全开源的软件,提供256-bit AES加密 源码编译: 1. OpenSSL编译 SQLCipher源码编译需要依赖OpenSSL提供的lib

python中的MySQL数据库操作 连接 插入 查询 更新 操作

MySQL数据库 就数据库而言,连接之后就要对其操作.但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?下面摘抄自维基百科对数据库表的简要解释,要想详细了解,需要看官在找一些有关数据库的教程和书籍来看看. 在关系数据库中,数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系.它由纵向的列和横向的行组成,例如一个有关作者信息的名为 authors 的表中,每个列包含的是所有作者的某个特定类型的信息,比如

Android程序员必掌握的sqlite数据库连表查询

SQL查询的基本原理:两种情况介绍. 第一.   单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后根据SELECT的选择列选择相应的列进行返回最终结果. 第二.   两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表:然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果. 第三.   多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连

Android程序猿必掌握的sqlite数据库连表查询

SQL查询的基本原理:两种情况介绍. 第一.   单表查询:依据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后依据SELECT的选择列选择对应的列进行返回终于结果. 第二.   两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表:然后依据WHERE条件过滤中间表的记录,并依据SELECT指定的列返回查询结果. 第三.   多表连接查询:先对第一个和第二个表依照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到全部的表都连