传送门:Android+Sqlite 实现古诗阅读应用(一)

  Hi,又回来了,最近接到很多热情洋溢的小伙伴们的来信,吼开心哈,我会继续努力的=-=!

  上回的东西我们做到了有个textview能随机选择诗来进行显示,这也是我做这个东西的初衷,我想找我到底有哪些古诗没有读过,更想感受一下风吹哪页看哪页的闲适(扯远了=-=!),所以功能现在差不多算是结束了,

不过一个古诗应用这么丑可不行,还有就是,我找到了我要的诗我也得能收藏啊,要是下次忘了可怎么办啊,所以这里面还有一些知识点,我们能从接下来的功能中学到:

1.再做一个启动界面:

  打开数据库,随着数据库的增大会有一点卡顿,我们加个界面来过渡缓解一下:

 1 package com.lfk.poem;
 2 import android.app.Activity;
 3 import android.content.Intent;
 4 import android.os.Bundle;
 5 import android.util.Log;
 6 import android.view.View;
 7 import android.view.animation.AlphaAnimation;
 8 import android.view.animation.Animation;
 9
10 /**
11  * Created by Administrator on 2015/4/11.
12  */
13 public class Opening extends Activity {
14     @Override
15     public void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         final View view = View.inflate(this, R.layout.activity_opening, null);
18         setContentView(view);
19         //渐变展示启动屏
20         AlphaAnimation start = new AlphaAnimation(0.3f,1.0f);
21         start.setDuration(2000);
22         view.startAnimation(start);
23         start.setAnimationListener(new Animation.AnimationListener()
24         {
25             @Override
26             public void onAnimationEnd(Animation arg0) {
27                 Log.e("linc", "---start!");
28                 try{
29                     Intent intent = new Intent();
30                     intent.setClass(Opening.this,MainActivity.class);
31                     Opening.this.startActivity(intent);
32                     Opening.this.finish();
33                 }
34                 catch(Exception e)
35                 {
36                     e.printStackTrace();
37                 }
38             }
39             @Override
40             public void onAnimationRepeat(Animation animation) {}
41             @Override
42             public void onAnimationStart(Animation animation) {}
43         });
44
45
46     }
47 }

这是做过的样子:

    

2.修改Actionbar为透明的叠加模式:

这个我在之前的博客里已经写过了,可以参考一下即时通讯的第五篇:http://www.cnblogs.com/lfk-dsk/p/4419418.html

3.数据库的导入:

  上次为了测试我们只导入了5首古诗作为测试,这回用正则表达式调整了格式,导入了唐诗三百首。

  

将txt做成了这种格式,然后倒入数据库管理软件。

  

数据库里的格式就是这样的了,然后替换数据库就好了,想要现成的可找我要。

4.背景和刷新:

  自然不用说添加自己喜欢的古风背景就好。

  刷新我不用Button了,改用google的下拉刷新,我在这个博文里写过:http://www.cnblogs.com/lfk-dsk/p/4433319.html

  每次刷新一下就会重新找一首诗。

5.主活动的修改

  1 package com.lfk.poem;
  2
  3 import android.app.Activity;
  4 import android.content.Intent;
  5 import android.database.Cursor;
  6 import android.database.sqlite.SQLiteDatabase;
  7 import android.graphics.Typeface;
  8 import android.os.Bundle;
  9 import android.os.Environment;
 10 import android.os.Handler;
 11 import android.support.v4.widget.SwipeRefreshLayout;
 12 import android.util.Log;
 13 import android.view.Menu;
 14 import android.view.MenuInflater;
 15 import android.view.MenuItem;
 16 import android.widget.RelativeLayout;
 17 import android.widget.TextView;
 18 import android.widget.Toast;
 19
 20 import java.io.File;
 21 import java.io.FileNotFoundException;
 22 import java.io.FileOutputStream;
 23 import java.io.IOException;
 24 import java.io.InputStream;
 25
 26
 27 public class MainActivity extends Activity {
 28     private  final int BUFFER_SIZE = 400000;
 29     public static final String DB_NAME = "poem_all.db"; //保存的数据库文件名
 30     public static final String DB_USER_NAME = "poem_user.db";
 31     public static final String PACKAGE_NAME = "com.lfk.poem";// 应用的包名
 32     public static final String DB_PATH = "/data"
 33             + Environment.getDataDirectory().getAbsolutePath() +"/"
 34             + PACKAGE_NAME+ "/databases"; // 在手机里存放数据库的位置
 35     private SwipeRefreshLayout swipeLayout;
 36     private RelativeLayout main_layout;
 37     private TextView textView;
 38     private static int ID = 0;
 39     private String NAME;
 40     private String POEM;
 41     @Override
 42     protected void onCreate(Bundle savedInstanceState) {
 43         super.onCreate(savedInstanceState);
 44         setContentView(R.layout.activity_main);
 45
 46         Typeface typeface = Typeface.createFromAsset(getAssets(),"fonts/font_ksj.ttf");
 47         textView = (TextView)findViewById(R.id.text_view);
 48         textView.setTypeface(typeface);
 49
 50         main_layout = (RelativeLayout)findViewById(R.id.main_layout);
 51         ChangeBackground();
 52         FindaPoem();
 53         swipeLayout = (SwipeRefreshLayout) this.findViewById(R.id.swipe_refresh);
 54         swipeLayout.setColorScheme(R.color.haah);
 55         swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
 56             @Override
 57             public void onRefresh() {
 58                 new Handler().postDelayed(new Runnable() {//延迟跳转=-=
 59                     public void run() {
 60                         swipeLayout.setRefreshing(true);
 61                         FindaPoem();
 62                         swipeLayout.setRefreshing(false);
 63                     }
 64                 }, 500);
 65             }
 66         });
 67     }
 68     private void FindaPoem() {
 69         int ll = (int) (1 + Math.random() * (59170));
 70         ID = ll;
 71         SQLiteDatabase database = openDatabase();
 72         Cursor cursor = database.rawQuery("Select * From poem Where _id = " + ll, null);
 73         cursor.moveToFirst();
 74         String poem = cursor.getString(1)+"\n"+"\n"+cursor.getString(2)+"\n"+"\n"+cursor.getString(13);
 75         NAME = cursor.getString(2)+": "+cursor.getString(1);
 76         POEM = cursor.getString(13);
 77         Log.e(poem, "================");
 78         textView.setText(poem);
 79         cursor.close();
 80         database.close();
 81     }
 82     private void ChangeBackground(){
 83         int ln = (int) (1 + Math.random() * (5));
 84         switch (ln){
 85             case 1:
 86                 main_layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.detail_bg));
 87                 break;
 88             case 2:
 89                 main_layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.navigation_1));
 90                 break;
 91             case 3:
 92                 main_layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.navigation_2));
 93                 break;
 94             case 4:
 95                 main_layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.navigation_3));
 96                 break;
 97             case 5:
 98                 main_layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.navigation_4));
 99                 break;
100         }
101     }
102     public SQLiteDatabase openDatabase() {
103         try {
104             File myDataPath = new File(DB_PATH);
105             if (!myDataPath.exists())
106             {
107                 myDataPath.mkdirs();// 如果没有这个目录,则创建
108             }
109             String dbfile = myDataPath+"/"+DB_NAME;
110             if (!(new File(dbfile).exists())) {// 判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库
111                 InputStream is;
112                 is = this.getResources().openRawResource(R.raw.poem_all); // 欲导入的数据库
113                 FileOutputStream fos = new FileOutputStream(dbfile);
114                 byte[] buffer = new byte[BUFFER_SIZE];
115                 int count = 0 ;
116                 while ((count = is.read(buffer)) > 0) {
117                         fos.write(buffer, 0, count);
118                 }
119                 fos.close();
120                 is.close();
121             }
122             SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
123             Log.e("=======================","get it  ======================");
124             return db;
125         } catch (FileNotFoundException e) {
126             Log.e("Database", "File not found");
127             e.printStackTrace();
128         } catch (IOException e) {
129             Log.e("Database", "IO exception");
130             e.printStackTrace();
131         }
132         return null;
133     }
134     void AddaPoemToCollect(){
135         File myDataPath = new File(DB_PATH);
136         String dbfile = myDataPath+"/"+DB_USER_NAME;
137         SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
138         //ContentValues contentValues = new ContentValues();
139         db.execSQL("UPDATE poem SET ticai = 1 WHERE _id ="+ID);
140         //db.insert("book", null, contentValues);
141         db.close();
142         Toast.makeText(getApplicationContext(),
143                 "Collect succeed",
144                 Toast.LENGTH_SHORT).show();
145         //ID++;
146     }
147     @Override
148     public boolean onCreateOptionsMenu(Menu menu) {
149         // Inflate the menu; this adds items to the action bar if it is present.
150         MenuInflater inflater = getMenuInflater();
151         inflater.inflate(R.menu.menu_main, menu);
152         return super.onCreateOptionsMenu(menu);
153     }
154
155     @Override
156     public boolean onOptionsItemSelected(MenuItem item) {
157         // Handle action bar item clicks here. The action bar will
158         // automatically handle clicks on the Home/Up button, so long
159         // as you specify a parent activity in AndroidManifest.xml.
160         int id = item.getItemId();
161         switch(id){
162             case R.id.collect:
163                 Intent intent = new Intent(this,Collect.class);
164                 startActivity(intent);
165                 break;
166             case R.id.like:
167                 AddaPoemToCollect();
168                 break;
169         }
170
171         return super.onOptionsItemSelected(item);
172     }
173 }

View Code

  这是修改过的主活动。

  1.首先更换了字体放在assets文件夹内,在res里面,没有的请新建。

1  Typeface typeface = Typeface.createFromAsset(getAssets(),"fonts/font_ksj.ttf");
2         textView = (TextView)findViewById(R.id.text_view);
3         textView.setTypeface(typeface);

获取了字体资源,注册了一个textview,把字体设置为textview。

    

这是修改过的效果,纤细的字体很适合我们的古诗!

  2.

 1     private void ChangeBackground(){
 2         int ln = (int) (1 + Math.random() * (5));
 3         switch (ln){
 4             case 1:
 5                 main_layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.detail_bg));
 6                 break;
 7             case 2:
 8                 main_layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.navigation_1));
 9                 break;
10             case 3:
11                 main_layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.navigation_2));
12                 break;
13             case 4:
14                 main_layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.navigation_3));
15                 break;
16             case 5:
17                 main_layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.navigation_4));
18                 break;
19         }
20     }

  添加了一个修改背景的函数,每次进入会随机选择背景,这样我们每次进入就有可能看到不一样的背景了。

  3.

 1     private void FindaPoem() {
 2         int ll = (int) (1 + Math.random() * (59170));
 3         ID = ll;
 4         SQLiteDatabase database = openDatabase();
 5         Cursor cursor = database.rawQuery("Select * From poem Where _id = " + ll, null);
 6         cursor.moveToFirst();
 7         String poem = cursor.getString(1)+"\n"+"\n"+cursor.getString(2)+"\n"+"\n"+cursor.getString(13);
 8         NAME = cursor.getString(2)+": "+cursor.getString(1);
 9         POEM = cursor.getString(13);
10         Log.e(poem, "================");
11         textView.setText(poem);
12         cursor.close();
13         database.close();
14     }

  从数据库里随即一个数(我数据库里有59170首诗,=-=!)然后打开数据库,找到ID为此项的诗,然后获取诗的内容,getString的号码要按照你自己的数据库需要选择不同的栏位,

比如0位就是ID的栏位,我这里面作者古诗名和古诗内容是分开存放的,而且加入了不少我要用的数据,所以栏位增加到了13个之多,自己做的话只需要三个栏位就好,一个id,一个古诗内容,

一个收藏标记位(用0和1来标记)

  所以我对dbhelper的数据库生成类进行了一些修改:

 1 package com.lfk.poem;
 2
 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteOpenHelper;
 6 import android.widget.Toast;
 7
 8 /**
 9  * Created by Administrator on 2015/5/8.
10  */
11 public class DBhelper extends SQLiteOpenHelper {
12     private  static final String CREAT_DB = "create table book ("
13             + "id integer primary key autoincrement,"
14             + "collect int,"
15             + "poem text)";
16     private Context mcontext;
17
18     public DBhelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
19         super(context, name, factory, version);
20         mcontext = context;
21     }
22
23     @Override
24     public void onCreate(SQLiteDatabase db) {
25         db.execSQL(CREAT_DB);
26         Toast.makeText(mcontext,"succeed collect!",Toast.LENGTH_SHORT).show();
27     }
28
29     @Override
30     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
31     }
32 }

  这样生成的数据库就能成功的应用收藏功能了,上一步所说的修改数据库也就能实现了。

6.收藏功能的实现:

  我在写这篇博文之前曾经写过两次关于收藏的内容,第一次的方法比较蠢,我又开了一个用户的数据库,然后把要收藏的东西复制进用户数据库中,不过这种方法比较麻烦,

首先是开两个数据库增加了系统的无谓开销,增加了对系统资源的消耗,而且在传入新的数据库中,id会发生变化,写入和传值会非常的不便利,所以我放弃了那种方法,改用

在数据库设置标志栏位的方法来解决问题。

  

  1 package com.lfk.poem;
  2
  3 import android.app.Activity;
  4 import android.content.Intent;
  5 import android.database.Cursor;
  6 import android.database.sqlite.SQLiteDatabase;
  7 import android.os.Bundle;
  8 import android.os.Environment;
  9 import android.util.Log;
 10 import android.view.View;
 11 import android.widget.AdapterView;
 12 import android.widget.ArrayAdapter;
 13 import android.widget.ListView;
 14 import android.widget.TextView;
 15 import android.widget.Toast;
 16
 17 import java.io.File;
 18
 19
 20 public class Collect extends Activity {
 21     private DBhelper dBhelper;
 22     private ListView listView;
 23     public static ArrayAdapter<String> mArrayAdapter;
 24     public static final String DB_NAME = "poem_all.db"; //保存的数据库文件名
 25     public static final String PACKAGE_NAME = "com.lfk.poem";// 应用的包名
 26     public static final String DB_PATH = "/data"
 27             + Environment.getDataDirectory().getAbsolutePath() +"/"
 28             + PACKAGE_NAME+ "/databases"; // 在手机里存放数据库的位置
 29     @Override
 30     protected void onCreate(Bundle savedInstanceState) {
 31         super.onCreate(savedInstanceState);
 32         setContentView(R.layout.activity_collect);
 33         String[] data = new String[0];
 34         //dBhelper = new DBhelper(this,"poem_all.db",null,1);
 35         listView = (ListView)findViewById(R.id.list_view);
 36         mArrayAdapter = new ArrayAdapter<String>(this,R.layout.list_item);
 37         listView.setAdapter(mArrayAdapter);
 38         FindyourCollect();
 39         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 40             @Override
 41             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
 42                                     long arg3) {
 43                 System.out.println(arg2);
 44                 String temp = (String)((TextView)arg1).getText();
 45                 Intent intent = new Intent();
 46                 intent.putExtra("title",temp);
 47                 System.out.println(arg2);
 48                 intent.setClass(Collect.this, Collect_item.class);
 49                 startActivity(intent);
 50                 Toast.makeText(getApplicationContext(),
 51                         "Opening " + arg2,
 52                         Toast.LENGTH_SHORT).show();
 53                 mArrayAdapter.notifyDataSetChanged();
 54             }
 55         });
 56     }
 57
 58
 59 //    @Override
 60 //    public boolean onCreateOptionsMenu(Menu menu) {
 61 //        // Inflate the menu; this adds items to the action bar if it is present.
 62 //        getMenuInflater().inflate(R.menu.menu_collect, menu);
 63 //        return true;
 64 //    }
 65 //
 66 //    @Override
 67 //    public boolean onOptionsItemSelected(MenuItem item) {
 68 //        // Handle action bar item clicks here. The action bar will
 69 //        // automatically handle clicks on the Home/Up button, so long
 70 //        // as you specify a parent activity in AndroidManifest.xml.
 71 //        int id = item.getItemId();
 72 //
 73 //        //noinspection SimplifiableIfStatement
 74 //        if (id == R.id.action_settings) {
 75 //            return true;
 76 //        }
 77 //
 78 //        return super.onOptionsItemSelected(item);
 79 //    }
 80     void FindyourCollect(){
 81         File myDataPath = new File(DB_PATH);
 82         String dbfile = myDataPath+"/"+DB_NAME;
 83         SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
 84         Cursor cursor = database.rawQuery("Select * From poem where ticai = 1", null);
 85         Log.e("===================", "================");
 86         if(cursor.moveToFirst()) {
 87             Log.e("===================", "================");
 88             do {
 89                 String title = cursor.getString(cursor.getColumnIndex("mingcheng"));
 90                 mArrayAdapter.add(title);
 91                 Log.e(title, "================");
 92             }while (cursor.moveToNext());
 93         }
 94         cursor.close();
 95         database.close();
 96     }
 97     @Override
 98     protected void onRestart(){
 99         super.onRestart();
100         mArrayAdapter.clear();
101         FindyourCollect();
102         mArrayAdapter.notifyDataSetChanged();
103     }
104 }

这是Collect的活动的代码,代码中用了一个系统自带的简易的listview(主要是也不需要太多的功能),进入之后运行FindyourCollect()方法用Select * From poem where ticai = 1语法,

寻找标志位,然后把所有找到的东西加入listview中去,然后设置item的响应打开。

 1 package com.lfk.poem;
 2
 3 import android.app.Activity;
 4 import android.content.Intent;
 5 import android.database.Cursor;
 6 import android.database.sqlite.SQLiteDatabase;
 7 import android.graphics.Typeface;
 8 import android.os.Bundle;
 9 import android.util.Log;
10 import android.view.Menu;
11 import android.view.MenuItem;
12 import android.widget.TextView;
13 import android.widget.Toast;
14
15
16 public class Collect_item extends Activity {
17     private DBhelper dBhelper;
18     private String ID;
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_collect_item);
23         Intent intent = getIntent();
24         String title = intent.getStringExtra("title");
25         //System.out.println(id+"=================");
26         TextView textView = (TextView)findViewById(R.id.poem_item);
27         Typeface typeface = Typeface.createFromAsset(getAssets(),"fonts/font_ksj.ttf");
28         textView.setTypeface(typeface);
29         dBhelper = new DBhelper(this,"poem_all.db",null,1);
30         SQLiteDatabase database = dBhelper.getWritableDatabase();
31         Cursor cursor = database.rawQuery("Select * From poem where mingcheng="+"\""+title+"\"", null);
32         cursor.moveToFirst();
33         ID = cursor.getString(cursor.getColumnIndex("_id"));
34         String poem = cursor.getString(1)+"\n"+"\n"+cursor.getString(2)+"\n"+"\n"+cursor.getString(13);
35         textView.setText(poem);
36         Log.e("===================", "================");
37         cursor.close();
38         database.close();
39     }
40
41     @Override
42     public boolean onCreateOptionsMenu(Menu menu) {
43         // Inflate the menu; this adds items to the action bar if it is present.
44         getMenuInflater().inflate(R.menu.menu_collect_item, menu);
45         return true;
46     }
47
48     @Override
49     public boolean onOptionsItemSelected(MenuItem item) {
50         // Handle action bar item clicks here. The action bar will
51         // automatically handle clicks on the Home/Up button, so long
52         // as you specify a parent activity in AndroidManifest.xml.
53         int id = item.getItemId();
54
55         if(id == R.id.dislike_collect){
56             SQLiteDatabase db = dBhelper.getWritableDatabase();
57             db.execSQL("UPDATE poem SET ticai = 0 WHERE _id ="+ID);
58             db.close();
59             Toast.makeText(getApplicationContext(),
60                     "Collect Delete",
61                     Toast.LENGTH_SHORT).show();
62         }
63
64         return super.onOptionsItemSelected(item);
65     }
66
67 }

打开后的方法比较简单和主活动基本一样,接受传入的题目,然后根据题目找到我们需要的诗,设置字体然后textview中显示出来。

然后就是加入收藏了,为了方便,我把加入收藏写进了meau中以方便使用:

 1  void AddaPoemToCollect(){
 2         //File myDataPath = new File(DB_PATH);
 3         //String dbfile = myDataPath+"/"+DB_USER_NAME;
 4         SQLiteDatabase db = openDatabase();
 5         //ContentValues contentValues = new ContentValues();
 6         db.execSQL("UPDATE poem SET ticai = 1 WHERE _id ="+ID);
 7         //db.insert("book", null, contentValues);
 8         db.close();
 9         Toast.makeText(getApplicationContext(),
10                 "Collect succeed",
11                 Toast.LENGTH_SHORT).show();
12         //ID++;
13     }
14     void deleteAPoemFromCollect(){
15         SQLiteDatabase db = openDatabase();
16
17         db.execSQL("UPDATE poem SET ticai = 0 WHERE _id ="+ID);
18
19         db.close();
20
21         Toast.makeText(getApplicationContext(),
22                 "Collect Delete",
23                 Toast.LENGTH_SHORT).show();
24     }

这个就是加入收藏和删除收藏的方法所在了,我在主活动和收藏的内容活动中都为meau添加了这个方法,并且设置了一个全局变量ID用于删除和加入收藏的时候寻址。

到此为止我们初期的功能就都开发完了,放出新的界面,图片还是暂时借用了别人的成例,我已经找UI帮我做更好看的界面了:

            

            

            

            

好了这一篇就说这么多吧,应该还会有一些新的有意思的功能要尝试,所以应该还会有后续吧!

么么哒,喜欢就点赞吧!!!

转载于:https://www.cnblogs.com/lfk-dsk/p/4510514.html

Android+Sqlite 实现古诗阅读应用(二)相关推荐

  1. Android+Sqlite 实现古诗阅读应用(一)

    不说网络app,很多本地的app都有一些随机的内容推送,比如随机推送一些小知识,古诗,名言名画什么的,界面制作的好看一点就能看起来特别的文艺范, 最近就是看了这样的一些应用,就想自己实现一下,这种方法 ...

  2. android用于查询数据的方法,android: SQLite查询数据

    掌握了查询数据的方法之后,你也就将数据库的 CRUD 操 作全部学完了.不过千万不要因此而放松,因为查询数据也是在 CRUD 中最复杂的一种 操作. 我们都知道 SQL 的全称是 Structured ...

  3. Android Studio实现文艺阅读App

    项目目录 一.系统概述 二.系统特点 三.开发环境 四.运行演示 五.源码获取 一.系统概述 本次带来的文艺阅读App可以提供高质量的原创文学作品.用户可以App中找到各种类型的文学作品,包括小说.散 ...

  4. android sqlite 中 创建表 不要使用 IF NOT EXISTS + TA...

    2019独角兽企业重金招聘Python工程师标准>>> android sqlite 中 创建表 不要使用 "IF NOT EXISTS " + TABLE_NA ...

  5. Android SQLite数据库的详细使用

    SQLite 简介 SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守ACID(原子性.一致性.隔离性.持久性)的关联式数据库管理系统,多用于嵌入式系统中 SQLite 数据库是无类型的,可 ...

  6. android 数据库表格数据库数据库中,Android SQLite数据库中的表详解

    Android SQLite数据库 前言 以前写PHP的时候,内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的 ...

  7. 利用SQLChiper对Android SQLite数据库加密

    利用SQLChiper对Android SQLite数据库加密 前言: 上篇文章讲了Android studio+SQLCipher加密SQLite数据库的几个坑,跳过这几个坑,那么SQLCipher ...

  8. Android SQLite 数据库详细介绍

    Android SQLite 数据库详细介绍我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软 ...

  9. android 上下滚动文字_计算机毕设项目004之Android系统在线小说阅读器

    计算机毕设项目004之Android系统在线小说阅读器 一. 项目名称 基于Android系统的在线小说阅读器 二. 项目简介 项目中的角色功能: 支持翻页动画:仿真翻页.覆盖翻页.上下滚动翻页等翻页 ...

最新文章

  1. AI安全最全“排雷图”来了!腾讯发布业内首个AI安全攻击矩阵
  2. 区块链系统之《基于区块链的PKI数字证书系统》
  3. python 知乎接口_Python采用Django制作简易的知乎日报API
  4. re:Invent第三天:除了拥抱混合云,AWS还一口气发了这些新产品
  5. 最小树形图+朱刘算法
  6. 利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具
  7. linux命令 翻译,(翻译)Linux命令行(一)
  8. Python之数据分析(算数平均值、加权平均值、最大值与最小值)
  9. 程序员必备技能之 Git 的体系结构与历史
  10. 试题8 算法训练 P0103(从键盘输入一个大写字母,要求改用小写字母输出。)
  11. linux所有内存监控,流量监控?负载监控?内存监控?IO监控?check_linux_stats全部替你搞定!...
  12. ISO 18000-6c 访问标签--应用程序访问操作ISO 18000-6C标签的方法
  13. 尺规作图切线的画法_基于尺规作图的新型公切线画法
  14. List、Map 与json转换的工具类
  15. 王者荣耀战力在线查询小程序源码
  16. BeagleBone Black Industrial系统更新设置一贴通
  17. CAS单点登录(SSO)介绍及部署
  18. AJAX与JavaScript脚本语言
  19. 计算机网络英文简称名词解释
  20. [Practical.Vim(2012.9)].Drew.Neil.Tip51 学习摘要

热门文章

  1. python中文免费版_Python官方免费版下载|Python中文版 V3.8.0 -推背图下载站
  2. Linux buffer/cache解读
  3. 全国计算机高新技术考试合格证书cad,全国计算机信息高新技术考试计算机辅助设计(Protel平台)绘图员级考试考试大纲...
  4. html编辑contentbuilder,HTML BUILDER
  5. 从零开始之uboot、移植uboot2017.01(二、从入口分析流程)
  6. Anomaly Detection and Recommender Systems
  7. lyh-前端 HTML 、 CSS 和 JS 的理解
  8. 摄像头基础知识-配件相关
  9. react-native 启动屏及App图标设置
  10. 计算机音乐乐谱后会无期,《后会无期》歌曲简谱