不说网络app,很多本地的app都有一些随机的内容推送,比如随机推送一些小知识,古诗,名言名画什么的,界面制作的好看一点就能看起来特别的文艺范,

最近就是看了这样的一些应用,就想自己实现一下,这种方法是自己想出来的,也不清楚那些app是怎么写出来的。

  在这个里面我用了android支持的sqlite这种轻型的数据库,正好补充一下之前没怎么用过的知识点。

1.首先,需要一个数据库文件:

  直接用数据库管理软件新建的sqlite会缺两个表,我也懒得自己添就用代码让android程序自己生成。

 package com.lfk.poem;

 import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast; /**
* Created by Administrator on 2015/5/8.
*/
public class DBhelper extends SQLiteOpenHelper {
private static final String CREAT_DB = "create table book ("
+ "id integer primary key autoincrement,"
+ "poem text)";
private Context mcontext; public DBhelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mcontext = context;
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREAT_DB);
Toast.makeText(mcontext,"succeed++++++++++",Toast.LENGTH_SHORT).show();
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}

首先重写一个dbhelper类extends SQLiteOpenHelper 类里面设置一个静态字符串,存入的字符串是定义新表的内容,第一个是id设置为顺序自增,第二个就是古诗了,设置为文本形式,

db.execSQL(CREAT_DB);用该语句在OnCreate里面进行生成*.db文件,然后发出一条提示succeed++++++++。

然后在主界面加个Button,在OnClick里面运行dbhelper.getWritableDatabase();就能创建/打开一个数据库。

2.为数据库添加内容:

现在我们拿到的是一个空的数据库,不能使用,我们也不想一条一条的手动输入内容,所以我们要把数据库拿出来。

在手机(或者模拟器里装个RE文件管理器)在data/data/<package name>/database/里就能找到你的数据库。

就象这样,然后把它拷到电脑里。

在电脑上安装Navicat for SQLite,打开你拿出来的.db文件:

里面的book就是我们刚才用代码新建的一个表文件,接着我们要准备好你要输入的内容。

id = poem
001=张九龄:感遇四首之一 孤鸿海上来,池潢不敢顾。侧见双翠鸟,巢在三珠树。矫矫珍木巅,得无金丸惧。美服患人指,高明逼神恶。今我游冥冥,弋者何所慕。
002=张九龄:感遇四首之二 兰叶春葳蕤,桂华秋皎洁。欣欣此生意,自尔为佳节。谁知林栖者,闻风坐相悦。草木有本心,何求美人折?
003=张九龄:感遇四首之三 幽人归独卧,滞虑洗孤清。持此谢高鸟,因之传远情。日夕怀空意,人谁感至精?飞沈理自隔,何所慰吾诚?
004=张九龄:感遇四首之四 江南有丹橘,经冬犹绿林。岂伊地气暖,自有岁寒心。可以荐嘉客,奈何阻重深!运命惟所遇,循环不可寻。徒言树桃李,此木岂无阴?
005=李白:下终南山过斛斯山人宿置酒 暮从碧山下,山月随人归,却顾所来径,苍苍横翠微。相携及田家,童稚开荆扉。绿竹入幽径,青萝拂行衣。欢言得所憩,美酒聊共挥。长歌吟松风,曲尽河星稀。我醉君复乐,陶然共忘机。

比如我写成了这样的固定格式,并写了他们的栏位名称(上正则表达式啊!)

然后右键book表选择倒入向导,在第三步设置分隔符为=

成功的话我们就会发现栏位都设定好了,这样我们就能成功导入了

再看我们的book表里面就有了数据了,这样我们就可以正常使用了:

好了,我们保存一下,放在我们工程的res下的raw文件夹。

3.修改主函数完成功能:

 1 package com.lfk.poem;
2
3 import android.content.Context;
4 import android.database.Cursor;
5 import android.database.sqlite.SQLiteDatabase;
6 import android.os.Bundle;
7 import android.os.Environment;
8 import android.support.v7.app.ActionBarActivity;
9 import android.util.Log;
10 import android.view.View;
11 import android.widget.Button;
12 import android.widget.TextView;
13
14 import java.io.File;
15 import java.io.FileNotFoundException;
16 import java.io.FileOutputStream;
17 import java.io.IOException;
18 import java.io.InputStream;
19
20
21 public class MainActivity extends ActionBarActivity {
22 private final int BUFFER_SIZE = 400000;
23 public static final String DB_NAME = "poem.db"; // 保存的数据库文件名
24 public static final String PACKAGE_NAME = "com.lfk.poem";// 应用的包名
25 public static final String DB_PATH = "/data"
26 + Environment.getDataDirectory().getAbsolutePath() +"/"                  //这里定义了一些参数,有文件的尺寸,包名,数据库名,存放数据库的位置等
27 + PACKAGE_NAME+ "/databases"; // 在手机里存放数据库的位置
28 private Context mcontext;
29 @Override
30 protected void onCreate(Bundle savedInstanceState) {
31 super.onCreate(savedInstanceState);
32 setContentView(R.layout.activity_main);
33 //dBhelper = new DBhelper(this,"poem.db",null,1);
34 SQLiteDatabase database = openDatabase();                        
35 Cursor cursor = database.query("book", null, null,null,null,null,null);          //这部分是我想把所有东西打印到日志里看看,可以删掉
36 if (cursor.moveToFirst()) {
37 do {
38 String id = cursor.getString(cursor.getColumnIndex("id"));
39 String poem = cursor.getString(cursor.getColumnIndex("poem"));
40 Log.e("id="+id,"poem="+poem);
41 }while (cursor.moveToNext());
42 }
43 cursor.close();
44 database.close();
45 Button button = (Button)findViewById(R.id.create_it);
46 button.setOnClickListener(new View.OnClickListener() {
47 @Override
48 public void onClick(View v) {
49 int ll = (int)(1+Math.random()*(5));
50 SQLiteDatabase database = openDatabase();
51 Cursor cursor = database.rawQuery("Select * From book Where id = "+ll, null);  //把Button的改了一下,设置了一个随机数1-5,打开数据库,然后用了sql的语句从book中找
52 cursor.moveToFirst();                                  //并且id=随机量然后取出第一位数据,0位是id把它设置进一个textview里面
53 String poem = cursor.getString(1);
54 Log.e(poem,"================");
55 TextView textView = (TextView)findViewById(R.id.text_view);
56 textView.setText(poem);
57 cursor.close();
           database.close();
58 }
59 });
60 }
61 public SQLiteDatabase openDatabase() {
62 try {
63 File myDataPath = new File(DB_PATH);
64 if (!myDataPath.exists())
65 {
66 myDataPath.mkdirs();// 如果没有这个目录,则创建
67 }
68 String dbfile = myDataPath+"/"+DB_NAME;
69 if (!(new File(dbfile).exists())) {// 判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库  //这段函数是用来打开数据库的,如果没有数据库,就会从raw文件夹复制到本地的文件夹
70 InputStream is;
71 is = this.getResources().openRawResource(R.raw.poem); // 欲导入的数据库
72 FileOutputStream fos = new FileOutputStream(dbfile);
73 byte[] buffer = new byte[BUFFER_SIZE];
74 int count = 0 ;
75 while ((count = is.read(buffer)) > 0) {
76 fos.write(buffer, 0, count);
77 }
78 fos.close();
79 is.close();
80 }
81 SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
82 Log.e("=======================","get it ======================");
83 return db;
84 } catch (FileNotFoundException e) {
85 Log.e("Database", "File not found");
86 e.printStackTrace();
87 } catch (IOException e) {
88 Log.e("Database", "IO exception");
89 e.printStackTrace();
90 }
91 return null;
92 }
93 }

这样我们就能把从数据库里面取到的数据显示在界面上了,到此为止,初步功能就完事了

可能还会有一篇博文,接下来就是要做一些界面的修改,毕竟现在这个画面还是太丑啦!

喜欢的请点赞,=_=!

Android+Sqlite 实现古诗阅读应用(一)的更多相关文章

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

    往期传送门: Android+Sqlite 实现古诗阅读应用(一) Android+Sqlite 实现古诗阅读应用(二) 加入截图分享的功能. 很多应用都有分享的功能,我也想在我的古诗App里加入这个 ...

  2. Android+Sqlite 实现古诗阅读应用(二)

    传送门:Android+Sqlite 实现古诗阅读应用(一) Hi,又回来了,最近接到很多热情洋溢的小伙伴们的来信,吼开心哈,我会继续努力的=-=! 上回的东西我们做到了有个textview能随机选择 ...

  3. 《阿里巴巴Android编码规范》阅读纪要(二)

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 本篇继续上一篇<阿里巴巴Android编码规范>阅读纪要(一) ,还是建议各位同学有时间完整阅读一下<阿里巴巴Android编码规 ...

  4. Android SQLite 通配符查询找不到参数问题

    使用Android SQLite中SQLiteDatabase类的query方法查询时,如果where中包含通配符,则参数会无法设置,如类似下面的方法查询时 SQLiteDatabase db = d ...

  5. Android Sqlite 数据库版本更新

      Android Sqlite 数据库版本更新 http://87426628.blog.163.com/blog/static/6069361820131069485844/ 1.自己写一个类继承 ...

  6. Android SQLite总结(一) (转)

    Android SQLite总结(一)  郑海波 2012-08-21 转载请声明:http://blog.csdn.net/nuptboyzhb/article/details/7891887 前言 ...

  7. android SQLite使用SQLiteOpenHelper类对数据库进行操作

    android SQLite使用SQLiteOpenHelper类对数据库进行操作 原文: http://byandby.iteye.com/blog/835580

  8. Android sqlite管理数据库基本用法

    Android操作系统中内置了sqlite数据库(有关sqlite数据库详细介绍见:http://zh.wikipedia.org/wiki/SQLite),而sqllite本身是一个很小型的数据库, ...

  9. Android 上的代码阅读器 CoderBrowserHD 修改支持 go 语言代码

    我在Android上的代码阅读器用的是 https://github.com/zerob13/CoderBrowserHD 改造的版本,改造后的版本我放在 https://github.com/ghj ...

随机推荐

  1. wpf 自定义消息框

    相信很多人用过MessageBox.show(),是不是觉得这个消息框有点丑呢,反正我是觉得有点丑的,所以我自己重写了一个.先不说,上两幅图对比先: 当然,也不是很好看,不过比原有的好多了. 不多说了 ...

  2. 将C1Chart数据导出到Excel

    大多数情况下,当我们说将图表导出到Excel时,意思是将Chart当成图片导出到Excel中.如果是这样,你可以参考帮助文档中保存和导出C1Chart章节. 不过,也有另一种情况,当你想把图表中的数据 ...

  3. Python基础(一),Day1

    python的安装 python2.x与3.x的部分区别 第一个python程序 变量 字符编码 注释 格式化字符串 用户输入 常用的模块初始 if判断 循环语句 作业 1.python的安装 可以在 ...

  4. Angularjs,WebAPI 搭建一个简易权限管理系统 —— WebAPI项目主体结构(四)

    目录 前言 Angularjs名词与概念 Angularjs 基本功能演示 系统业务与实现 WebAPI项目主体结构 Angularjs 前端主体结构 5.0 WebAPI项目主体结构 5.1 总体结 ...

  5. 维翔主机asp主机使用遇到的问题及解决方案总结

    1.数据库配置 在这里,我们会发现,红色圈起来的部分"Webadmin"处点击之后会报错,这是因为,数据库管理工具没有进行域名解析,需要在域名购买商处添加一个域名解析,mssql, ...

  6. 关于ApplicationPoolIdentity

    一直以来IIS中的网站默认都是以network service在运行,但是从IIS7开始,默认会以ApplicationPoolIdentity运行. 这个账户比较特殊,是一种虚拟帐户,你无法在计算机 ...

  7. [leetcode] Number of Islands

    Number of Islands Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. ...

  8. NSDate,NSNumber,NSValue

    NSDate #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleas ...

  9. HTTP 协议中的 Content-Encoding 和 Transfer-Encoding(内容编码和传输编码)

    转自:http://network.51cto.com/art/201509/491335.htm Transfer-Encoding,是一个 HTTP 头部字段,字面意思是「传输编码」.实际上,HT ...

  10. 使用sysbench进行压力测试

    sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试.数据库目前支持MySQL/Oracle/PostgreSQL/Drizzle,它主要包括以下几 ...