不说网络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. sql 执行时间

    SET STATISTICS PROFILE ON SET STATISTICS IO ON SET STATISTICS TIME ON --GO /*--你的SQL脚本开始*/SELECT * F ...

  2. LeetCode1:Two Sum

    题目: Given an array of integers, find two numbers such that they add up to a specific target number. ...

  3. [Tool] 使用CodeMaid自动程序排版

    [Tool] 使用CodeMaid自动程序排版 前言 「使用StyleCop验证命名规则」这篇文章,指引开发人员透过StyleCop这个工具,来自动检验项目中产出的程序代码是否合乎命名规则. [Too ...

  4. owl-carousel轮播插件的使用

    插件github地址:https://github.com/OwlFonk/OwlCarousel: 插件官网演示地址:http://owlgraphic.com/owlcarousel/: 1.选择 ...

  5. Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.

    改下build.gradle文件,将里面的compileSdkVersion改为23即可 apply plugin: 'com.android.application' android { compi ...

  6. Mybatis学习记录(七)----Mybatis延迟加载

    1.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: ...

  7. HorizontalScrollView实现先左滑动后右滑动动画

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s ...

  8. C迷途指针

    在计算机编程领域中,迷途指针,或称悬空指针.野指针,指的是不指向任何合法的对象的指针. 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指 ...

  9. Android 设置EditText光标Curso颜色及粗细

    在android的输入框里,如果要修改光标的颜色及粗细步骤如下两步即可搞定: 1.在资源文件drawable下新建一个光标控制color_cursor.xml <?xml version=&qu ...

  10. IOS 杂笔-4(属性与成员变量的区别)

    属性可以用点语法,比如self.xxx,在外部调用也同样可以someClass.xxx. 属性实际上是对一组set和get方法的简单封装(oc的get方法没有get前缀),同样会自动生成一个私有的成员 ...