zoukankan      html  css  js  c++  java
  • Android+Sqlite 实现古诗阅读应用(一)

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

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

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

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

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

     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             + "poem text)";
    15     private Context mcontext;
    16 
    17     public DBhelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
    18         super(context, name, factory, version);
    19         mcontext = context;
    20     }
    21 
    22     @Override
    23     public void onCreate(SQLiteDatabase db) {
    24         db.execSQL(CREAT_DB);
    25         Toast.makeText(mcontext,"succeed++++++++++",Toast.LENGTH_SHORT).show();
    26     }
    27 
    28     @Override
    29     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    30     }
    31 }

    首先重写一个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 }

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

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

    喜欢的请点赞,=_=!

  • 相关阅读:
    助教小结4
    第二次作业
    助教小结5
    助教小结3
    work3
    助教小结1
    课后第一次作业
    助教小结2
    第一次团队作业
    悟透 JavaScript
  • 原文地址:https://www.cnblogs.com/lfk-dsk/p/4492974.html
Copyright © 2011-2022 走看看