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

简介:

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

    首先,sqlite可以去官网http://www.sqlite.org/lang.html,去查询所有进行的操作,创建表,增删改查等等。

    wKioL1Q8hzrRc6OcAASOz9FSWeA686.jpg    wKiom1Q8h42DqWJ1AAGP9bo56TI104.jpg    然后就是建一个sqlite的类继承至SQLiteOpenHelper:

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
package  com.liangxiao.usingsqlite;
 
import  android.content.Context;
import  android.database.sqlite.SQLiteDatabase;
import  android.database.sqlite.SQLiteDatabase.CursorFactory;
import  android.database.sqlite.SQLiteOpenHelper;
 
public  class  Db  extends  SQLiteOpenHelper {
 
     public  Db(Context context, String name, CursorFactory factory,  int  version) {
         super (context,  "db" null 1 );
         // TODO Auto-generated constructor stub
     }
 
     @Override
     public  void  onCreate(SQLiteDatabase db) {
         // TODO Auto-generated method stub
         // db.execSQL("CREATE TABLE USER(" + "name TEXT DEFAULT \"\","
         // + "sex TEXT DEFAULT \"\")");
         db.execSQL( "CREATE TABLE USER("
                 + "_id INTEGER PRIMARY KEY AUTOINCREMENT,"
                 "name TEXT DEFAULT \"\","  "sex TEXT DEFAULT \"\")" );
         // db.execSQL("CREATE TABLE USER(" + "name TEXT DEFAULT \"\"");
     }
 
     @Override
     public  void  onUpgrade(SQLiteDatabase db,  int  oldVersion,  int  newVersion) {
         // TODO Auto-generated method stub
 
     }
 
}

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

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

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

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

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
33
34
35
36
37
package  com.liangxiao.usingsqlite;
 
import  android.app.Activity;
import  android.database.Cursor;
import  android.database.sqlite.SQLiteDatabase;
import  android.os.Bundle;
import  android.widget.TextView;
 
public  class  MainActivity_dbRead  extends  Activity {
     private  TextView xianshi;
 
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main_dbread);
         xianshi = (TextView) findViewById(R.id.xianshi);
         read_db();
 
     }
 
     /**
      * 读取db部分
      */
     private  void  read_db() {
         Db db =  new  Db( this "db" null 1 );
         SQLiteDatabase dbRead = db.getReadableDatabase();
         Cursor c = dbRead.query( "user" null null null null null null );
         while  (c.moveToNext()) {
             String name = c.getString(c.getColumnIndex( "name" ));
             String sex = c.getString(c.getColumnIndex( "sex" ));
             db_lastindex_content +=  "心情:"  + name +  "  "  "当事人:"  + sex +  "\n" ;
         }
         xianshi.setText(db_lastindex_content.toString());
     }
 
     private  String db_lastindex_content =  "" ;
}

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

    主窗体MainActivity:

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
33
34
35
36
37
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
package  com.liangxiao.usingsqlite;
 
import  android.app.Activity;
import  android.content.ContentValues;
import  android.content.Intent;
import  android.database.Cursor;
import  android.database.sqlite.SQLiteDatabase;
import  android.os.Bundle;
import  android.view.View;
import  android.view.View.OnClickListener;
import  android.widget.Button;
import  android.widget.EditText;
import  android.widget.TextView;
import  android.widget.Toast;
 
public  class  MainActivity  extends  Activity  implements  OnClickListener {
     private  Button btn_fly;
     private  TextView xianshi1;
     private  EditText add_db_text;
     private  EditText add_db_text2;
     private  Db db;
     private  SQLiteDatabase dbRead, dbWrite;
     private  Cursor c;
 
     // private String add_db_text_string;
     // private String add_db_text_string2;
 
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
         init();
         read_db();
     }
 
     /**
      * 初始化部分
      */
     private  void  init() {
         xianshi1 = (TextView) findViewById(R.id.xianshi1);
         btn_fly = (Button) findViewById(R.id.btn_fly);
         add_db_text = (EditText) findViewById(R.id.add_db_text);
         add_db_text2 = (EditText) findViewById(R.id.add_db_text2);
 
         btn_fly.setOnClickListener( this );
     }
 
     /**
      * 添加操作部分
      */
     private  void  add_db() {
         String add_db_text_string = add_db_text.getText().toString();
         String add_db_text_string2 = add_db_text2.getText().toString();
         Toast.makeText( this , add_db_text_string +  ","  + add_db_text_string2,  2 )
                 .show();
         db =  new  Db( this "db" null 1 );
         dbWrite = db.getWritableDatabase();
         ContentValues cv =  new  ContentValues();
         cv.put( "name" , add_db_text_string);
         cv.put( "sex" , add_db_text_string2);
         dbWrite.insert( "user" null , cv);
         dbWrite.close();
     }
 
     /**
      * 读取db部分
      */
     private  void  read_db() {
         db =  new  Db( this "db" null 1 );
         dbRead = db.getReadableDatabase();
         c = dbRead.query( "user" null null null null null null );
         while  (c.moveToNext()) {
             String name = c.getString(c.getColumnIndex( "name" ));
             String sex = c.getString(c.getColumnIndex( "sex" ));
             System.out.println(String.format( "name%s,sex%s" , name, sex));
             // xianshi1.setText("心情:" + name + "  " + "当事人:" + sex + "\n");
             db_dateBase +=  "心情:"  + name +  "  "  "当事人:"  + sex +  "\n" ;
 
         }
         xianshi1.setText(db_dateBase.toString());
     }
 
     private  String db_dateBase =  "" ;
 
     private  void  refresh() {
         db =  new  Db( this "db" null 1 );
         dbRead = db.getReadableDatabase();
         c = dbRead.query( "user" null null null null null null );
         while  (c.moveToNext()) {
             String name = c.getString(c.getColumnIndex( "name" ));
             String sex = c.getString(c.getColumnIndex( "sex" ));
             System.out.println(String.format( "name%s,sex%s" , name, sex));
             // xianshi1.setText("心情:" + name + "  " + "当事人:" + sex + "\n");
             db_dateBase =  "心情:"  + name +  "  "  "当事人:"  + sex +  "\n" ;
 
         }
         String xinshi_text_lastindex = xianshi1.getText().toString();
         xianshi1.setText(xinshi_text_lastindex+db_dateBase.toString());
 
     }
 
     /**
      * click部分
      */
     @Override
     public  void  onClick(View v) {
         add_db();
         refresh();
         // Intent intent = new Intent();
         // intent.setClass(MainActivity.this, MainActivity_dbRead.class);
         // MainActivity.this.startActivity(intent);
         // MainActivity.this.finish();
     }
}

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

    两种效果如下:

wKiom1Q8lhjzhqmVAADFpVlO2Qk485.jpg

wKioL1Q8l9GAQGoVAADKV6sTv4E812.jpg


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

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
33
34
35
36
37
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
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
package  com.liangxiao.usingsqlite;
 
import  android.app.AlertDialog;
import  android.app.ListActivity;
import  android.content.ContentValues;
import  android.content.DialogInterface;
import  android.content.Intent;
import  android.database.Cursor;
import  android.database.sqlite.SQLiteDatabase;
import  android.os.Bundle;
import  android.view.KeyEvent;
import  android.view.View;
import  android.view.View.OnClickListener;
import  android.widget.AdapterView;
import  android.widget.AdapterView.OnItemClickListener;
import  android.widget.AdapterView.OnItemLongClickListener;
import  android.widget.Button;
import  android.widget.EditText;
import  android.widget.ListView;
import  android.widget.RelativeLayout;
import  android.widget.RelativeLayout.LayoutParams;
import  android.widget.SimpleCursorAdapter;
import  android.widget.TextView;
import  android.widget.Toast;
 
public  class  MainActivity_ListView_db  extends  ListActivity  implements
         OnClickListener {
     private  ListView list;
     private  EditText edit_name, edit_sex;
     private  TextView tvname, tvsex;
     private  Button btn;
     private  SimpleCursorAdapter adapter;
     private  Db db;
     private  SQLiteDatabase dbRead, dbWrite;
     private  Cursor c;
     private  long  firstime =  0 ;
     private  RelativeLayout mainLayout;
 
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main_listview);
         init();
         db_add_read();
         refreshListView();
     }
 
     private  void  init() {
         btn = (Button) findViewById(R.id.btn);
         // list = (ListView) findViewById(R.id.list);
         edit_name = (EditText) findViewById(R.id.edit_name);
         edit_sex = (EditText) findViewById(R.id.edit_sex);
         btn.setOnClickListener( this );
 
     }
 
     private  void  db_add_read() {
         db =  new  Db( this "db" null 1 );
         dbRead = db.getReadableDatabase();
         // c = dbRead.query("user", null, null, null, null, null, null);
         dbWrite = db.getWritableDatabase();
         adapter =  new  SimpleCursorAdapter( this ,
                 R.layout.activity_main_listview_item,  null new  String[] {
                         "name" "sex"  },  new  int [] { R.id.tvname, R.id.tvsex });
         // list.setAdapter(adapter);
         setListAdapter(adapter);
         // 删除操作部分
         getListView().setOnItemLongClickListener( new  OnItemLongClickListener() {
 
             @Override
             public  boolean  onItemLongClick(AdapterView<?> parent, View view,
                     final  int  position,  long  id) {
                 new  AlertDialog.Builder(MainActivity_ListView_db. this )
                         .setTitle( "你妹妹" )
                         .setMessage( "Are you sure?" )
                         .setNegativeButton( "No" null )
                         .setPositiveButton( "delete" ,
                                 new  DialogInterface.OnClickListener() {
 
                                     @Override
                                     public  void  onClick(DialogInterface arg0,
                                             int  arg1) {
                                         // TODO Auto-generated method stub
                                         Cursor c = adapter.getCursor();
                                         c.moveToPosition(position);
 
                                         int  itemId = c.getInt(c
                                                 .getColumnIndex( "_id" ));
                                         dbWrite.delete( "user" "_id=?" ,
                                                 new  String[] { itemId +  ""  });
                                         refreshListView();
                                     }
                                 }).show();
 
                 return  true ;
             }
         });
         // 修改部分
         getListView().setOnItemClickListener( new  OnItemClickListener() {
 
             @Override
             public  void  onItemClick(AdapterView<?> parent, View view,
                     int  position,  long  id) {
                 Cursor c = adapter.getCursor();
                 c.moveToPosition(position);
 
                 int  itemId = c.getInt(c.getColumnIndex( "_id" ));
 
                 Intent intent =  new  Intent();
                 intent.putExtra( "itemId" , itemId +  "" );
                 intent.setClass(MainActivity_ListView_db. this ,
                         MainActivity_ListView_db_detail. class );
                 MainActivity_ListView_db. this .startActivity(intent);
                 MainActivity_ListView_db. this .finish();
             }
         });
     }
 
     private  void  refreshListView() {
         c = dbRead.query( "user" null null null null null null );
         adapter.changeCursor(c);
     }
 
     @Override
     public  void  onClick(View v) {
         // TODO Auto-generated method stub
         if  (v == btn) {
             ContentValues cv =  new  ContentValues();
             cv.put( "name" , edit_name.getText().toString());
             cv.put( "sex" , edit_sex.getText().toString());
             dbWrite.insert( "user" null , cv);
             refreshListView();
             edit_name.getText().clear();
             edit_sex.getText().clear();
         }
     }
 
     @Override
     public  boolean  onKeyDown( int  keyCode, KeyEvent event) {
         if  (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() ==  0 ) {
             // RelativeLayout.LayoutParams lp = (LayoutParams) mainLayout
             // .getLayoutParams();
             long  secondtime = System.currentTimeMillis();
             if  (secondtime - firstime >  3000 ) {
                 Toast.makeText(MainActivity_ListView_db. this "再按一次返回键退出" ,
                         Toast.LENGTH_SHORT).show();
                 firstime = System.currentTimeMillis();
                 return  true ;
             else  {
                 MainActivity_ListView_db. this .finish();
                 System.exit( 0 );
                 android.os.Process.killProcess(android.os.Process.myPid());
             }
         }
         return  super .onKeyDown(keyCode, event);
     }
}

    然后是编辑MainActivity_ListView_db_detail:

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
33
34
35
36
37
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
package  com.liangxiao.usingsqlite;
 
import  android.app.Activity;
import  android.content.ContentValues;
import  android.content.Intent;
import  android.database.Cursor;
import  android.database.sqlite.SQLiteDatabase;
import  android.os.Bundle;
import  android.view.KeyEvent;
import  android.view.View;
import  android.widget.Button;
import  android.widget.EditText;
import  android.widget.Toast;
 
public  class  MainActivity_ListView_db_detail  extends  Activity {
     private  EditText name, sex;
     private  Button btn_update;
     private  SQLiteDatabase dbRead, dbWrite;
     private  String itemId;
     private  Cursor c;
     private  Db db;
 
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main_listview_detail);
         init();
         Intent intent = getIntent();
         itemId = intent.getStringExtra( "itemId" );
         c = dbRead.query( "user" null "_id=?" new  String[] { itemId },  null ,
                 null null );
         // String name1 = c.getString(c.getColumnName(1));
         if  (c.moveToFirst()) {
             String name1 = c.getString(c.getColumnIndex( "name" ));
             String sex1 = c.getString(c.getColumnIndex( "sex" ));
             name.setText(name1);
             sex.setText(sex1);
         }
         c.close();
     }
 
     private  void  init() {
         db =  new  Db( this "db" null 1 );
         dbRead = db.getReadableDatabase();
         dbWrite = db.getWritableDatabase();
         name = (EditText) findViewById(R.id.name);
         sex = (EditText) findViewById(R.id.sex);
         btn_update = (Button) findViewById(R.id.btn_update);
 
         btn_update.setOnClickListener( new  View.OnClickListener() {
 
             @Override
             public  void  onClick(View arg0) {
                 ContentValues cv =  new  ContentValues();
                 cv.put( "name" , name.getText().toString());
                 cv.put( "sex" , sex.getText().toString());
                 // dbWrite.insert("user", null, cv);
                 dbWrite.update( "user" , cv,  "_id=?" new  String[] { itemId });
                 Intent intent =  new  Intent(
                         MainActivity_ListView_db_detail. this ,
                         MainActivity_ListView_db. class );
                 MainActivity_ListView_db_detail. this .startActivity(intent);
                 MainActivity_ListView_db_detail. this .finish();
             }
         });
     }
 
     @Override
     public  boolean  onKeyDown( int  keyCode, KeyEvent event) {
         if  (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() ==  0 ) {
             Intent intent =  new  Intent(MainActivity_ListView_db_detail. this ,
                     MainActivity_ListView_db. class );
             MainActivity_ListView_db_detail. this .startActivity(intent);
             MainActivity_ListView_db_detail. this .finish();
         }
         return  super .onKeyDown(keyCode, event);
     }
}

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

wKiom1Q8mBTA6mTnAADKsTbzCVQ956.jpg

wKioL1Q8mEuSiDWbAADUlnCJF3w913.jpg

wKiom1Q8mBTB4LjxAADJYs8ujH0324.jpg









本文转自 吴雨声 51CTO博客,原文链接:http://blog.51cto.com/liangxiao/1563815,如需转载请自行联系原作者
目录
相关文章
|
存储 API 文件存储
47. 【Android教程】SharedPreferences 存储
47. 【Android教程】SharedPreferences 存储
182 2
|
JavaScript 前端开发 Android开发
让Vite+Vue3项目在Android端离线打开(不需要起服务)
让Vite+Vue3项目在Android端离线打开(不需要起服务)
546 10
|
存储 安全 API
Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore
本文介绍了 Android 开发中常用的键值对存储方案,包括 SharedPreferences、MMKV 和 DataStore,并对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。
717 1
|
Android开发 Windows
如何离线下载 Microsoft Corporation II Windows Subsystem for Android
如何离线下载 Microsoft Corporation II Windows Subsystem for Android
497 1
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
408 2
|
SQL 存储 数据库
48. 【Android教程】数据库:SQLite 的使用
48. 【Android教程】数据库:SQLite 的使用
331 1
|
存储 监控 Java
Android Service之设备存储空间监控 DeviceStorageMonitorService
Android Service之设备存储空间监控 DeviceStorageMonitorService
275 2
|
存储 缓存 数据库
Android之SQLite数据库使用详解
Android之SQLite数据库使用详解
1154 0
|
XML BI 数据库
一个基于Android Studio的简易记事本应用
一个基于Android Studio的简易记事本应用
353 0
|
存储 数据库 Android开发
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
527 0

热门文章

最新文章