天天看点

Android第十九期 - Sqlite离线存储教你写小米记事本

  这期说sqlite离线存储,最近app要加上离线文件下载的功能,自己也是弄了一天,总算是小有成果,要好好感谢老婆的大力支持,帮我测试什么的,都任劳任怨,现在能这样对我这样的好的人只有老婆了。分享代码给大家,看着一些记事本都很实用,所以也就估摸着弄了一个,UI自己设计吧,功能实现了一切都好说。下面开始:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<code>package</code> <code>com.liangxiao.usingsqlite;</code>

<code>import</code> <code>android.content.Context;</code>

<code>import</code> <code>android.database.sqlite.SQLiteDatabase;</code>

<code>import</code> <code>android.database.sqlite.SQLiteDatabase.CursorFactory;</code>

<code>import</code> <code>android.database.sqlite.SQLiteOpenHelper;</code>

<code>public</code> <code>class</code> <code>Db </code><code>extends</code> <code>SQLiteOpenHelper {</code>

<code>    </code><code>public</code> <code>Db(Context context, String name, CursorFactory factory, </code><code>int</code> <code>version) {</code>

<code>        </code><code>super</code><code>(context, </code><code>"db"</code><code>, </code><code>null</code><code>, </code><code>1</code><code>);</code>

<code>        </code><code>// TODO Auto-generated constructor stub</code>

<code>    </code><code>}</code>

<code>    </code><code>@Override</code>

<code>    </code><code>public</code> <code>void</code> <code>onCreate(SQLiteDatabase db) {</code>

<code>        </code><code>// TODO Auto-generated method stub</code>

<code>        </code><code>// db.execSQL("CREATE TABLE USER(" + "name TEXT DEFAULT \"\","</code>

<code>        </code><code>// + "sex TEXT DEFAULT \"\")");</code>

<code>        </code><code>db.execSQL(</code><code>"CREATE TABLE USER("</code>

<code>                </code><code>+</code><code>"_id INTEGER PRIMARY KEY AUTOINCREMENT,"</code>

<code>                </code><code>+ </code><code>"name TEXT DEFAULT \"\","</code> <code>+ </code><code>"sex TEXT DEFAULT \"\")"</code><code>);</code>

<code>        </code><code>// db.execSQL("CREATE TABLE USER(" + "name TEXT DEFAULT \"\"");</code>

<code>    </code><code>public</code> <code>void</code> <code>onUpgrade(SQLiteDatabase db, </code><code>int</code> <code>oldVersion, </code><code>int</code> <code>newVersion) {</code>

<code>}</code>

    注意:这里面的adapter我用了官方自带的方便操作了,所以需求引用表的_id ,就加了一个字段。

    然后是我给大家写了两种读取操作界面,一种是textview的读取,一种是listview的读取方式。

    先说textview,大家可以发挥想象去构造UI,什么下拉悬停,ScrollView等等。

    代码我都注释过PS:跳转窗体到MainActivity_dbRead:

33

34

35

36

37

<code>import</code> <code>android.app.Activity;</code>

<code>import</code> <code>android.database.Cursor;</code>

<code>import</code> <code>android.os.Bundle;</code>

<code>import</code> <code>android.widget.TextView;</code>

<code>public</code> <code>class</code> <code>MainActivity_dbRead </code><code>extends</code> <code>Activity {</code>

<code>    </code><code>private</code> <code>TextView xianshi;</code>

<code>    </code><code>protected</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>

<code>        </code><code>super</code><code>.onCreate(savedInstanceState);</code>

<code>        </code><code>setContentView(R.layout.activity_main_dbread);</code>

<code>        </code><code>xianshi = (TextView) findViewById(R.id.xianshi);</code>

<code>        </code><code>read_db();</code>

<code>    </code><code>/**</code>

<code>     </code><code>* 读取db部分</code>

<code>     </code><code>*/</code>

<code>    </code><code>private</code> <code>void</code> <code>read_db() {</code>

<code>        </code><code>Db db = </code><code>new</code> <code>Db(</code><code>this</code><code>, </code><code>"db"</code><code>, </code><code>null</code><code>, </code><code>1</code><code>);</code>

<code>        </code><code>SQLiteDatabase dbRead = db.getReadableDatabase();</code>

<code>        </code><code>Cursor c = dbRead.query(</code><code>"user"</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>);</code>

<code>        </code><code>while</code> <code>(c.moveToNext()) {</code>

<code>            </code><code>String name = c.getString(c.getColumnIndex(</code><code>"name"</code><code>));</code>

<code>            </code><code>String sex = c.getString(c.getColumnIndex(</code><code>"sex"</code><code>));</code>

<code>            </code><code>db_lastindex_content += </code><code>"心情:"</code> <code>+ name + </code><code>"  "</code> <code>+ </code><code>"当事人:"</code> <code>+ sex + </code><code>"\n"</code><code>;</code>

<code>        </code><code>}</code>

<code>        </code><code>xianshi.setText(db_lastindex_content.toString());</code>

<code>    </code><code>private</code> <code>String db_lastindex_content = </code><code>""</code><code>;</code>

    注意:这个textview你可以在当前的页面显示你的操作,也可以跳转操作,都会直接显示在主UI上,没有卡顿的现象,很流畅的。

    主窗体MainActivity:

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

<code>import</code> <code>android.content.ContentValues;</code>

<code>import</code> <code>android.content.Intent;</code>

<code>import</code> <code>android.view.View;</code>

<code>import</code> <code>android.view.View.OnClickListener;</code>

<code>import</code> <code>android.widget.Button;</code>

<code>import</code> <code>android.widget.EditText;</code>

<code>import</code> <code>android.widget.Toast;</code>

<code>public</code> <code>class</code> <code>MainActivity </code><code>extends</code> <code>Activity </code><code>implements</code> <code>OnClickListener {</code>

<code>    </code><code>private</code> <code>Button btn_fly;</code>

<code>    </code><code>private</code> <code>TextView xianshi1;</code>

<code>    </code><code>private</code> <code>EditText add_db_text;</code>

<code>    </code><code>private</code> <code>EditText add_db_text2;</code>

<code>    </code><code>private</code> <code>Db db;</code>

<code>    </code><code>private</code> <code>SQLiteDatabase dbRead, dbWrite;</code>

<code>    </code><code>private</code> <code>Cursor c;</code>

<code>    </code><code>// private String add_db_text_string;</code>

<code>    </code><code>// private String add_db_text_string2;</code>

<code>        </code><code>setContentView(R.layout.activity_main);</code>

<code>        </code><code>init();</code>

<code>     </code><code>* 初始化部分</code>

<code>    </code><code>private</code> <code>void</code> <code>init() {</code>

<code>        </code><code>xianshi1 = (TextView) findViewById(R.id.xianshi1);</code>

<code>        </code><code>btn_fly = (Button) findViewById(R.id.btn_fly);</code>

<code>        </code><code>add_db_text = (EditText) findViewById(R.id.add_db_text);</code>

<code>        </code><code>add_db_text2 = (EditText) findViewById(R.id.add_db_text2);</code>

<code>        </code><code>btn_fly.setOnClickListener(</code><code>this</code><code>);</code>

<code>     </code><code>* 添加操作部分</code>

<code>    </code><code>private</code> <code>void</code> <code>add_db() {</code>

<code>        </code><code>String add_db_text_string = add_db_text.getText().toString();</code>

<code>        </code><code>String add_db_text_string2 = add_db_text2.getText().toString();</code>

<code>        </code><code>Toast.makeText(</code><code>this</code><code>, add_db_text_string + </code><code>","</code> <code>+ add_db_text_string2, </code><code>2</code><code>)</code>

<code>                </code><code>.show();</code>

<code>        </code><code>db = </code><code>new</code> <code>Db(</code><code>this</code><code>, </code><code>"db"</code><code>, </code><code>null</code><code>, </code><code>1</code><code>);</code>

<code>        </code><code>dbWrite = db.getWritableDatabase();</code>

<code>        </code><code>ContentValues cv = </code><code>new</code> <code>ContentValues();</code>

<code>        </code><code>cv.put(</code><code>"name"</code><code>, add_db_text_string);</code>

<code>        </code><code>cv.put(</code><code>"sex"</code><code>, add_db_text_string2);</code>

<code>        </code><code>dbWrite.insert(</code><code>"user"</code><code>, </code><code>null</code><code>, cv);</code>

<code>        </code><code>dbWrite.close();</code>

<code>        </code><code>dbRead = db.getReadableDatabase();</code>

<code>        </code><code>c = dbRead.query(</code><code>"user"</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>);</code>

<code>            </code><code>System.out.println(String.format(</code><code>"name%s,sex%s"</code><code>, name, sex));</code>

<code>            </code><code>// xianshi1.setText("心情:" + name + "  " + "当事人:" + sex + "\n");</code>

<code>            </code><code>db_dateBase += </code><code>"心情:"</code> <code>+ name + </code><code>"  "</code> <code>+ </code><code>"当事人:"</code> <code>+ sex + </code><code>"\n"</code><code>;</code>

<code>        </code><code>xianshi1.setText(db_dateBase.toString());</code>

<code>    </code><code>private</code> <code>String db_dateBase = </code><code>""</code><code>;</code>

<code>    </code><code>private</code> <code>void</code> <code>refresh() {</code>

<code>            </code><code>db_dateBase = </code><code>"心情:"</code> <code>+ name + </code><code>"  "</code> <code>+ </code><code>"当事人:"</code> <code>+ sex + </code><code>"\n"</code><code>;</code>

<code>        </code><code>String xinshi_text_lastindex = xianshi1.getText().toString();</code>

<code>        </code><code>xianshi1.setText(xinshi_text_lastindex+db_dateBase.toString());</code>

<code>     </code><code>* click部分</code>

<code>    </code><code>public</code> <code>void</code> <code>onClick(View v) {</code>

<code>        </code><code>add_db();</code>

<code>        </code><code>refresh();</code>

<code>        </code><code>// Intent intent = new Intent();</code>

<code>        </code><code>// intent.setClass(MainActivity.this, MainActivity_dbRead.class);</code>

<code>        </code><code>// MainActivity.this.startActivity(intent);</code>

<code>        </code><code>// MainActivity.this.finish();</code>

    注意在onClick中,我注释的部分是跳转的操作,当前的是主窗体的UI显示操作。

    两种效果如下:

<a href="http://s3.51cto.com/wyfs02/M02/4C/65/wKiom1Q8lhjzhqmVAADFpVlO2Qk485.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/4C/66/wKioL1Q8l9GAQGoVAADKV6sTv4E812.jpg" target="_blank"></a>

    然后是对于listview的操作,大家一般都是对于这个操作多些,首先是主窗体MainActivity_ListView_db:

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

<code>import</code> <code>android.app.AlertDialog;</code>

<code>import</code> <code>android.app.ListActivity;</code>

<code>import</code> <code>android.content.DialogInterface;</code>

<code>import</code> <code>android.view.KeyEvent;</code>

<code>import</code> <code>android.widget.AdapterView;</code>

<code>import</code> <code>android.widget.AdapterView.OnItemClickListener;</code>

<code>import</code> <code>android.widget.AdapterView.OnItemLongClickListener;</code>

<code>import</code> <code>android.widget.ListView;</code>

<code>import</code> <code>android.widget.RelativeLayout;</code>

<code>import</code> <code>android.widget.RelativeLayout.LayoutParams;</code>

<code>import</code> <code>android.widget.SimpleCursorAdapter;</code>

<code>public</code> <code>class</code> <code>MainActivity_ListView_db </code><code>extends</code> <code>ListActivity </code><code>implements</code>

<code>        </code><code>OnClickListener {</code>

<code>    </code><code>private</code> <code>ListView list;</code>

<code>    </code><code>private</code> <code>EditText edit_name, edit_sex;</code>

<code>    </code><code>private</code> <code>TextView tvname, tvsex;</code>

<code>    </code><code>private</code> <code>Button btn;</code>

<code>    </code><code>private</code> <code>SimpleCursorAdapter adapter;</code>

<code>    </code><code>private</code> <code>long</code> <code>firstime = </code><code>0</code><code>;</code>

<code>    </code><code>private</code> <code>RelativeLayout mainLayout;</code>

<code>        </code><code>setContentView(R.layout.activity_main_listview);</code>

<code>        </code><code>db_add_read();</code>

<code>        </code><code>refreshListView();</code>

<code>        </code><code>btn = (Button) findViewById(R.id.btn);</code>

<code>        </code><code>// list = (ListView) findViewById(R.id.list);</code>

<code>        </code><code>edit_name = (EditText) findViewById(R.id.edit_name);</code>

<code>        </code><code>edit_sex = (EditText) findViewById(R.id.edit_sex);</code>

<code>        </code><code>btn.setOnClickListener(</code><code>this</code><code>);</code>

<code>    </code><code>private</code> <code>void</code> <code>db_add_read() {</code>

<code>        </code><code>// c = dbRead.query("user", null, null, null, null, null, null);</code>

<code>        </code><code>adapter = </code><code>new</code> <code>SimpleCursorAdapter(</code><code>this</code><code>,</code>

<code>                </code><code>R.layout.activity_main_listview_item, </code><code>null</code><code>, </code><code>new</code> <code>String[] {</code>

<code>                        </code><code>"name"</code><code>, </code><code>"sex"</code> <code>}, </code><code>new</code> <code>int</code><code>[] { R.id.tvname, R.id.tvsex });</code>

<code>        </code><code>// list.setAdapter(adapter);</code>

<code>        </code><code>setListAdapter(adapter);</code>

<code>        </code><code>// 删除操作部分</code>

<code>        </code><code>getListView().setOnItemLongClickListener(</code><code>new</code> <code>OnItemLongClickListener() {</code>

<code>            </code><code>@Override</code>

<code>            </code><code>public</code> <code>boolean</code> <code>onItemLongClick(AdapterView&lt;?&gt; parent, View view,</code>

<code>                    </code><code>final</code> <code>int</code> <code>position, </code><code>long</code> <code>id) {</code>

<code>                </code><code>new</code> <code>AlertDialog.Builder(MainActivity_ListView_db.</code><code>this</code><code>)</code>

<code>                        </code><code>.setTitle(</code><code>"你妹妹"</code><code>)</code>

<code>                        </code><code>.setMessage(</code><code>"Are you sure?"</code><code>)</code>

<code>                        </code><code>.setNegativeButton(</code><code>"No"</code><code>, </code><code>null</code><code>)</code>

<code>                        </code><code>.setPositiveButton(</code><code>"delete"</code><code>,</code>

<code>                                </code><code>new</code> <code>DialogInterface.OnClickListener() {</code>

<code>                                    </code><code>@Override</code>

<code>                                    </code><code>public</code> <code>void</code> <code>onClick(DialogInterface arg0,</code>

<code>                                            </code><code>int</code> <code>arg1) {</code>

<code>                                        </code><code>// TODO Auto-generated method stub</code>

<code>                                        </code><code>Cursor c = adapter.getCursor();</code>

<code>                                        </code><code>c.moveToPosition(position);</code>

<code>                                        </code><code>int</code> <code>itemId = c.getInt(c</code>

<code>                                                </code><code>.getColumnIndex(</code><code>"_id"</code><code>));</code>

<code>                                        </code><code>dbWrite.delete(</code><code>"user"</code><code>, </code><code>"_id=?"</code><code>,</code>

<code>                                                </code><code>new</code> <code>String[] { itemId + </code><code>""</code> <code>});</code>

<code>                                        </code><code>refreshListView();</code>

<code>                                    </code><code>}</code>

<code>                                </code><code>}).show();</code>

<code>                </code><code>return</code> <code>true</code><code>;</code>

<code>            </code><code>}</code>

<code>        </code><code>});</code>

<code>        </code><code>// 修改部分</code>

<code>        </code><code>getListView().setOnItemClickListener(</code><code>new</code> <code>OnItemClickListener() {</code>

<code>            </code><code>public</code> <code>void</code> <code>onItemClick(AdapterView&lt;?&gt; parent, View view,</code>

<code>                    </code><code>int</code> <code>position, </code><code>long</code> <code>id) {</code>

<code>                </code><code>Cursor c = adapter.getCursor();</code>

<code>                </code><code>c.moveToPosition(position);</code>

<code>                </code><code>int</code> <code>itemId = c.getInt(c.getColumnIndex(</code><code>"_id"</code><code>));</code>

<code>                </code><code>Intent intent = </code><code>new</code> <code>Intent();</code>

<code>                </code><code>intent.putExtra(</code><code>"itemId"</code><code>, itemId + </code><code>""</code><code>);</code>

<code>                </code><code>intent.setClass(MainActivity_ListView_db.</code><code>this</code><code>,</code>

<code>                        </code><code>MainActivity_ListView_db_detail.</code><code>class</code><code>);</code>

<code>                </code><code>MainActivity_ListView_db.</code><code>this</code><code>.startActivity(intent);</code>

<code>                </code><code>MainActivity_ListView_db.</code><code>this</code><code>.finish();</code>

<code>    </code><code>private</code> <code>void</code> <code>refreshListView() {</code>

<code>        </code><code>adapter.changeCursor(c);</code>

<code>        </code><code>if</code> <code>(v == btn) {</code>

<code>            </code><code>ContentValues cv = </code><code>new</code> <code>ContentValues();</code>

<code>            </code><code>cv.put(</code><code>"name"</code><code>, edit_name.getText().toString());</code>

<code>            </code><code>cv.put(</code><code>"sex"</code><code>, edit_sex.getText().toString());</code>

<code>            </code><code>dbWrite.insert(</code><code>"user"</code><code>, </code><code>null</code><code>, cv);</code>

<code>            </code><code>refreshListView();</code>

<code>            </code><code>edit_name.getText().clear();</code>

<code>            </code><code>edit_sex.getText().clear();</code>

<code>    </code><code>public</code> <code>boolean</code> <code>onKeyDown(</code><code>int</code> <code>keyCode, KeyEvent event) {</code>

<code>        </code><code>if</code> <code>(keyCode == KeyEvent.KEYCODE_BACK &amp;&amp; event.getRepeatCount() == </code><code>0</code><code>) {</code>

<code>            </code><code>// RelativeLayout.LayoutParams lp = (LayoutParams) mainLayout</code>

<code>            </code><code>// .getLayoutParams();</code>

<code>            </code><code>long</code> <code>secondtime = System.currentTimeMillis();</code>

<code>            </code><code>if</code> <code>(secondtime - firstime &gt; </code><code>3000</code><code>) {</code>

<code>                </code><code>Toast.makeText(MainActivity_ListView_db.</code><code>this</code><code>, </code><code>"再按一次返回键退出"</code><code>,</code>

<code>                        </code><code>Toast.LENGTH_SHORT).show();</code>

<code>                </code><code>firstime = System.currentTimeMillis();</code>

<code>            </code><code>} </code><code>else</code> <code>{</code>

<code>                </code><code>System.exit(</code><code>0</code><code>);</code>

<code>                </code><code>android.os.Process.killProcess(android.os.Process.myPid());</code>

<code>        </code><code>return</code> <code>super</code><code>.onKeyDown(keyCode, event);</code>

    然后是编辑MainActivity_ListView_db_detail:

<code>public</code> <code>class</code> <code>MainActivity_ListView_db_detail </code><code>extends</code> <code>Activity {</code>

<code>    </code><code>private</code> <code>EditText name, sex;</code>

<code>    </code><code>private</code> <code>Button btn_update;</code>

<code>    </code><code>private</code> <code>String itemId;</code>

<code>        </code><code>setContentView(R.layout.activity_main_listview_detail);</code>

<code>        </code><code>Intent intent = getIntent();</code>

<code>        </code><code>itemId = intent.getStringExtra(</code><code>"itemId"</code><code>);</code>

<code>        </code><code>c = dbRead.query(</code><code>"user"</code><code>, </code><code>null</code><code>, </code><code>"_id=?"</code><code>, </code><code>new</code> <code>String[] { itemId }, </code><code>null</code><code>,</code>

<code>                </code><code>null</code><code>, </code><code>null</code><code>);</code>

<code>        </code><code>// String name1 = c.getString(c.getColumnName(1));</code>

<code>        </code><code>if</code> <code>(c.moveToFirst()) {</code>

<code>            </code><code>String name1 = c.getString(c.getColumnIndex(</code><code>"name"</code><code>));</code>

<code>            </code><code>String sex1 = c.getString(c.getColumnIndex(</code><code>"sex"</code><code>));</code>

<code>            </code><code>name.setText(name1);</code>

<code>            </code><code>sex.setText(sex1);</code>

<code>        </code><code>c.close();</code>

<code>        </code><code>name = (EditText) findViewById(R.id.name);</code>

<code>        </code><code>sex = (EditText) findViewById(R.id.sex);</code>

<code>        </code><code>btn_update = (Button) findViewById(R.id.btn_update);</code>

<code>        </code><code>btn_update.setOnClickListener(</code><code>new</code> <code>View.OnClickListener() {</code>

<code>            </code><code>public</code> <code>void</code> <code>onClick(View arg0) {</code>

<code>                </code><code>ContentValues cv = </code><code>new</code> <code>ContentValues();</code>

<code>                </code><code>cv.put(</code><code>"name"</code><code>, name.getText().toString());</code>

<code>                </code><code>cv.put(</code><code>"sex"</code><code>, sex.getText().toString());</code>

<code>                </code><code>// dbWrite.insert("user", null, cv);</code>

<code>                </code><code>dbWrite.update(</code><code>"user"</code><code>, cv, </code><code>"_id=?"</code><code>, </code><code>new</code> <code>String[] { itemId });</code>

<code>                </code><code>Intent intent = </code><code>new</code> <code>Intent(</code>

<code>                        </code><code>MainActivity_ListView_db_detail.</code><code>this</code><code>,</code>

<code>                        </code><code>MainActivity_ListView_db.</code><code>class</code><code>);</code>

<code>                </code><code>MainActivity_ListView_db_detail.</code><code>this</code><code>.startActivity(intent);</code>

<code>                </code><code>MainActivity_ListView_db_detail.</code><code>this</code><code>.finish();</code>

<code>            </code><code>Intent intent = </code><code>new</code> <code>Intent(MainActivity_ListView_db_detail.</code><code>this</code><code>,</code>

<code>                    </code><code>MainActivity_ListView_db.</code><code>class</code><code>);</code>

<code>            </code><code>MainActivity_ListView_db_detail.</code><code>this</code><code>.startActivity(intent);</code>

<code>            </code><code>MainActivity_ListView_db_detail.</code><code>this</code><code>.finish();</code>

    注意:编辑详情的有两个操作,一个是查询所在listview的id的一行记录,还有更新操作。而主窗体是读取和添加的操作。代码里面都写的比较详细,自己看吧,PS:这个里面有2个小操作,一个是listeview item点击,一个是长按,自己试试吧,效果如下图:

<a href="http://s3.51cto.com/wyfs02/M00/4C/65/wKiom1Q8mBTA6mTnAADKsTbzCVQ956.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/4C/66/wKioL1Q8mEuSiDWbAADUlnCJF3w913.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/4C/65/wKiom1Q8mBTB4LjxAADJYs8ujH0324.jpg" target="_blank"></a>

本文转自 吴雨声 51CTO博客,原文链接:http://blog.51cto.com/liangxiao/1563815,如需转载请自行联系原作者

继续阅读