当前位置:首页 > 图片 > 影像记忆 > 正文
文章正文

android 动态建数据库表 蓝鸥:Android SQLite数据库增加 删除 修改 查询

图片 > 影像记忆 > :android 动态建数据库表 蓝鸥:Android SQLite数据库增加 删除 修改 查询是由美文导刊网(www.eorder.net.cn)为您精心收集,如果觉得好,请把这篇文章复制到您的博客或告诉您的朋友,以下是android 动态建数据库表 蓝鸥:Android SQLite数据库增加 删除 修改 查询的正文:

蓝鸥:Android SQLite数据库增加 删除 修改 查询

学习Android必然要知道数据库的使用,Android使用的是SQLite数据库。对于SQLite数据库的基本信息这里就不介绍了,我们主要是看下怎么使用它。

与其他数据库不一样的地方

以前我们做javaWeb开发时用jdbc连接,现在变了,个人觉得变得简单了。在应用程序中直接就可以去创建数据库,然后对其进行操作,不用像以前写连接代码。

操作数据库

一:SQLiteOpenHelper 类

getReadableDatabase()得到可读的数据库,返回SQLiteDatabase对象,然后通过对象进行数据库操作。

getWritableDatabase()得到可写的数据库,返回SQLiteDatabase对象,然后通过对象进行数据库操作。

onCreate(SQLiteDatabase db)在第一次创建数据库时调用。

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)在更改数据库时都会调用。

onOpen(SQLiteDatabase db)当数据库打开时调用。

close()关闭数据库。

二:SQLiteDatabase类

这个类提供了对数据库的一些基本操作:

insert()

delete()

update()

query()

代码:

SQLiteOpenHelper的子类:

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.database.sqlite.SQLiteOpenHelper;

/**

* 通过getReadableDatabase()和getWritableDatabase()可以获得数据库对象。

* 提供onCreate()-创建数据库时,onUpgrade()-升级数据库时,两个回调函数。

*/

public class DatabaseHelper extends SQLiteOpenHelper {

// 按要求必须要有构造函数

public DatabaseHelper(Context context, String name, CursorFactory factory,

int version) {

super(context, name, factory, version);

(android 动态建数据库表)

}

// 当第一次得到SQLiteDatabase对象时,调用该方法

@Override

public void onCreate(SQLiteDatabase db) {

String sql = "create table MSG(id int,body varchar(100))";

db.execSQL(sql);

System.out.println("创建了一个数据库!");

}

// 当更新数据库时执行该方法

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

System.out.println("更新了数据库!");

// 还可以写其他的操作

}

}

有了这个类后,我们就可以对数据库进行增、删、改、查操作了。

插入数据:

//生成ContentValues对象,key:列名,value:想插入的值

ContentValues values = new ContentValues();

values.put("id", 1);

values.put("body", "hello");

DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, "text_msg", null, 2);

//得到可写的SQLiteDatabase对象

SQLiteDatabase db = dbhelper.getWritableDatabase();

//调用insert方法,将数据插入数据库

//参数1:表名

//参数2:如果你想插入空值,那么你必须指定它的所在的列

db.insert("MSG", null, values);

System.out.println("插入了:1, hello");

删除数据:

1

2

3

4

5

6

DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, "text_msg", null, 2);

//得到可写的SQLiteDatabase对象

SQLiteDatabase db = dbhelper.getWritableDatabase();

//调用delete方法,删除数据

db.delete("MSG", "id=?", new String[]{"1"});

System.out.println("删除了:id=1");

修改数据:

ContentValues values = new ContentValues();

values.put("body", "my dear!");

DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, "text_msg", null, 2);

//得到可写的SQLiteDatabase对象

SQLiteDatabase db = dbhelper.getWritableDatabase();

//调用insert方法,将数据插入数据库

//参数3:where 子句 "?"是占位符号,对应后面的"1",这和web开发时的语法是一样的

db.update("MSG", values, "id=?", new String[]{"1"});

System.out.println("更新了:hello-->my dear!");

查询数据:

DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, "text_msg", null, 2);

//得到可读的SQLiteDatabase对象

SQLiteDatabase db = dbhelper.getReadableDatabase();

//参数1:表名(android 动态建数据库表)

//参数2:要想显示的列

//参数3:where子句

//参数4:where子句对应的条件值

//参数5:分组方式

//参数6:having条件

//参数7:排序方式

Cursor cursor = db.query("MSG", new String[]{"id","body"}, "id=?", new String[]{"1"}, null, null, null);

System.out.println("查到的数据为:");(android 动态建数据库表)

while(cursor.moveToNext()){

int id = cursor.getInt(cursor.getColumnIndex("id"));

String name = cursor.getString(cursor.getColumnIndex("body"));

System.out.println("-->"+id+"::::::::::"+name);

}

怎样使用adb查看数据库?

SQLite没有客户端,不能直接查看数据库,所以我们用它提供的adb吧,当然,对数据库的操作方法很多,这只是其中一种。

1、进入命令行后输入adb回车,会显示很多的信息。

2、输入adb shell回车,就进入了Linux命令行,现在就可以使用Linux的命令了。

3、ls回车,显示所有的东西,其中有个data。(ls:显示所有,cd:进入)

4、cd data回车,再ls回车,cd data回车,ls回车后就会看到很多的com.。。。的东西,那就是机器上的应用程序,找到你应用程序的包名,然后进入。

5、进去后在查看所有,会发现个databases,进入databases,显示所有就会发现你的数据库名字,我这里使用的是"text_msg"。

(android 动态建数据库表)

6、sqlite3 text_msg回车就进入了你的数据库了,然后“.schema”就会看到该应用程序的所有表及建表语句。

7、现在你就可以使用标准的SQL语句查看刚才生成的数据库及数据了。

蓝鸥科技是一家集产、学、研为一体的综合性移动互联网研发培训机构,致力于iOS开发、Unity3D游戏开发、和HTML5前端开发等软件人才的培养。蓝鸥强大的师资阵容,纯净的教育理念,严格的管理制度,使其成为了美国苹果公司AATC认证官方授权培训中心、Unity官方授权培训中心,也是目前国内仅有的一家”两大官方授权于一身“的移动互联网培训企业。返回搜狐,查看更多

一个三年Android开发的总结 - 常见数据库问题总结

Android应用开发离不开对SQLite数据库的操作,一般简单的增删改查,可以直接通过SQLiteDatabase进行,但是只要操作变得频繁,并且随着需求不断增加,你应该考虑使用ORM框架,至少使用SQLiteOpenHelper,结合需要用ContentProvider再封装一层。本文不介绍具体的使用方法,而是列出一些常见的问题,供分析参考。

使用问题

1.SQLiteOpenHelper

(1)一个管理数据库连接的辅助类,缓存了已打开的数据库对象,提供了onConfigure onCreate onOpen,getReadableDatabase getWriteableDatabase方法;数据库文件不会直接创建,而是在调用getReadableDatabase或者getWriteableDatabase时才调用onConfigure等方法完成。在这个过程中会比较传入的数据库版本号,从而调用onDowngrade onUpgrade处理升级逻辑,默认的onDowngrade直接抛出异常。同时注意只有在版本号version等于0时,才会调用onCreate方法,所以数据库建表之类的操作可以在此方法中处理。

(2)单个数据库连接 数据库相关操作都将是顺序执行的,因此使用单例的SQLiteOpenHelper,可以基本保证数据库执行的顺序性,避免操作被锁或阻塞

2.ContentProvider

ContentProvider封装后对外提供URI,内部既可以是对数据库的操作,也可以是文件甚至内存的操作。需要注意的是它提供的query delete等操作是在调用的线程中执行的,而非只在主线程。据我在Android4.X时的设备上统计,一般查询操作很快,在1ms左右,而单个的插入删除操作在10ms左右,如果希望界面流畅,在UI线程谨慎的修改数据库。

异常问题

数据库被锁异常

android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)

at android.database.sqlite.SQLiteConnection.nativeExecuteForLong(Native Method)

at android.database.sqlite.SQLiteConnection.executeForLong(SQLiteConnection.java:595)

可以出现此问题的一种情况是:创建多个SQLiteOpenHelper实例,一个对应的连接正在写,另一个getWritableDatabase 。 需要避免创建多个实例。

2.android.database.CursorWindowAllocationException

android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed

android.database.CursorWindowAllocationException:

Cursor window allocation of 2048 kb failed. # Open Cursors=22 (# cursors opened

by this proc=22)

或者Could not allocate CursorWindow xxx.db of size 2097152 due to error -9.

一般前者出现open cursors过多,可能是cursor没有close导致,比较稳妥的方法在 可能忽略的Java基础知识 - 理解内部类和匿名内部类,异常与异常捕获有介绍。而如果是due to error后面跟-12表示内存消耗过多 具体数值和对应的原因如下所示

(android 动态建数据库表)

#defineEPERM 1 /* Operation not permitted */#defineENOENT 2 /* No such file or directory */#defineESRCH 3 /* No such process */#defineEINTR 4 /* Interrupted system call */#defineEIO 5 /* I/O error*/#defineENXIO 6 /* No such device or address */#defineE2BIG 7 /* Argument list too long */#defineENOEXEC 8 /* Exec format error*/#defineEBADF 9 /* Bad file number */#defineECHILD 10 /* No child processes */#defineEAGAIN 11 /* Try again */#defineENOMEM 12 /* Out of memory */#defineEACCES 13 /* Permission denied */#defineEFAULT 14 /* Bad address */#defineENOTBLK 15 /* Block device required */#defineEBUSY 16 /* Device or resource busy */#defineEEXIST 17 /* File exists */#defineEXDEV 18 /* Cross-device link */#defineENODEV 19 /* No such device */#defineENOTDIR 20 /* Not a directory */#defineEISDIR 21 /* Is a directory */#defineEINVAL 22 /* Invalid argument */#defineENFILE 23 /* File table overflow */#defineEMFILE 24 /* Too many open files */#defineENOTTY 25 /* Not a typewriter */#defineETXTBSY 26 /* Text file busy */#defineEFBIG 27 /* File too large */#defineENOSPC 28 /* No space left on device */#defineESPIPE 29 /* Illegal seek */#defineEROFS 30 /* Read-only file system */#defineEMLINK 31 /* Too many links */#defineEPIPE 32 /* Broken pipe */#defineEDOM 33 /* Math argument out of domain of func */#defineERANGE 34 /* Math result not representable */

是在源码的errno-base.h中可以查到

3.android.database.sqlite.SQLiteDiskIOException

有时碰到android.database.sqlite.SQLiteDiskIOException ,例如

android.database.sqlite.SQLiteDiskIOException: disk I/O error

(code 266)

可根据后面的error code来查找并判断原因,在 SQLite Result Codes中查询具体的错误码即可

这个计算的步骤如下:

sqlite3.h中定义了错误码,首先与上0xff得到错误原因,再根据除去最后两个字节的值来判断具体的原因。如266,转成二进制为1 0000 1010,首先与(&)上0xff为1010,也就是SQLITE_IOERR,然后去掉低两个字节,为1,则是SQLITE_IOERR_READ,再到 SQLite Result Codes中查询具体的原因

#defineSQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))#defineSQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))#defineSQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))#defineSQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))

(266) SQLITE_IOERR_READThe SQLITE_IOERR_READ error code is an extended error code for SQLITE_IOERR indicating an I/O error in the VFS layer while trying to read from a file on disk. This error might result from a hardware malfunction or because a filesystem came unmounted while the file was open.

版权声明:“并发编程网”所推送文章,除非确实无法确认,我们都会注明作者和来源。部分文章推送时未能与原作者取得联系。若涉及版权问题,烦请原作者联系我们,我们会在24小时内删除处理,谢谢!^_^15701189222

微信号:并发编程网

长按、关注

返回搜狐,查看更多


一.android中sqlite能否动态创建数据表

什么是动态创建数据表。。长订拜寡之干瓣吮抱经。不懂
表建了就是建了,删了就是删了,建完了表就删那还建它干啥,你是想实现什么功能啊


二.android 数据库建好后,怎么建表

SQLite 创建表
下面是教程来自于android学习手册,android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳
SQLite 的 CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类型。
语法
CREATE TABLE 语句的基本语法如下:
CREATE TABLE database_name.table_name(
column1 datatype PRIMARY KEY(one or more columns),
column2 datatype,
column3 datatype,
.....
columnN datatype,
);

CREATE TABLE 是告诉数据库系统创建一个新表的关键字。CREATE TABLE 语句后跟着表的唯一的名称或标识。您也可以选择指定带有table_name 的 database_name。
实例
下面是一个实例,它创建了一个 COMPANY 表,ID 作为主键,NOT NULL 的约束表示在表中创建纪录时这些字段不能为 NULL:
sqlite> CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);

让我们再创建一个表,我们将在随后章节的练习中使用:
sqlite> CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);

您可以使用 SQLIte 命令中的 .tables 命令来验证表是否已成功创建,该命令用于列出附加数据库中的所有表。
sqlite>.tables
COMPANY DEPARTMENT

在这里,可以看到我们刚创建的两张表 COMPANY、 DEPARTMENT。
您可以使用 SQLite .schema 命令得到表的完整信息,如下所示:
sqlite>.schem氦亥份酵莓寂逢檄抚漏a COMPANY
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);...余下全文>>


三.android studio 在sqlite数据库怎么动态创建多张表

Android数据库是比较轻量筏畅摧堆诋瞪搓缺掸画级的,数据存储量不宜过大、创建的数据表不宜太复杂...至于上面说的两个数据库,大家可以自行选择使用: SQLite

查看"软件开发"分类更多问题

回顶部↑

四.如何在Android开发中动态加载的list列表数据

创建LayoutInflater类的对象inflater,并取得其对象。

获取列表中的敞抚搬幌植呵邦童鲍阔数据,可用异步加载或者同步加载数据取得,方法不等。

将数据填充到simpleAdapter对象中去,注意参数有讲究

取得将要填充的ListView组件
将Adapter对象填充在listView组件中去


五.android数据库存储,代码创建数据库、表,实现编辑框内输入,点击按钮提交进行存入;从数据库中提

常量类:ConstantUtil
public class ConstantUtil {// 数据库名称public static final String DATABASE_NAME = "user_manager.db";// 数据库版本号public static final int DATABASE_VERSION = 1;//表名public static final String TABLE_NAME = "user_info";//字段名public static final String USER_ID = "userId";public static final String USER_NAME = "username";public static final String USER_PASSWORD = "password";public static final String USER_ADDRESS = "address";}
自定义SQLiteOpenHelper:MySQLiteOpenHelper
public class MySQLiteOpenHelper extends SQLiteOpenHelper {// 定义一个SQLiteDatabase对象,对表进行相应的操作private SQLiteDatabase mDatabase;public MySQLiteOpenHelper(Context context) {super(context, ConstantUtil.DATABASE_NAME, null,ConstantUtil.DATABASE_VERSION);mDatabase = getWritableDatabase();}/* * 创建表 */@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stub//sql语句String sql = "create table " + ConstantUtil.TABLE_NAME + "("+ ConstantUtil.USER_ID + " integer primary key,"+ ConstantUtil.USER_NAME + " text not null,"+ ConstantUtil.USER_PASSWORD + " text not null,"+ ConstantUtil.USER_ADDRESS + " text not null)";db.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubonCreat......余下全文>>


六.android如何根据数据库里的信息动态生成按钮

用代码创建按钮就好了,想创建多少就创建多少
你在layout里面放一个view
Button btn1=new Button(this);
btn.setTag="":<虎弧港旧蕃搅歌些攻氓br />btn.setOnClickListener(this);
view.add(btn1)


七.android中怎样在sqlite中创建一个数据库然后在该数据库中创建两个表?20分

在 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("create table sunCount(id integer primary key autoincrement,conut 唬长杠短蕲的搁痊功花integer)");
}
这里面创建 更新数数据库 再创建一张表 就可以了 创建表的方法 和开始一样
...........
this.helper = new SunDatabasehelper(Context);
this.db = this.helper.getWritableDatabase();
this.helper.onUpgrade(this.db, 1, 2);
........
你懂得 不解释


八.请教Android中数据库表结构

  SQPte 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQPte.   SQPte 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQPte 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQPte 的内核变得更加方便。   图 1. SQPte 内部结构      SQPte 基本上符合 SQL-92 标准,和其他的主要 SQL 数据库没什么区别。它的优点就是高效,Android 运行时环境包含了完整的 SQPte。   SQPte 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQPte 将检查它的类型。如果该类型与关联的列不匹配,则 SQPte 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQPte 称这为“弱类型”(manifest typing.)。   此外,SQPte 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FPL OUTER JOIN, 还有一些 ALTER TABLE 功能。   除了上述功能外,SQPte 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。   Android 集成了 SQPte 数据库   Android 在运行时(run-time)集成了 SQPte,所以每个 Android 应用程序都可以使用 SQPte 数据库。对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQPte 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQPte 数据库,Android 开发中,程序员需要学使用这些 API。   数据库存储在 data/< 项目文件夹 >/databases/ 下。   Android 开发中使用 SQPte 数据库   Activites 可以通过 Content Provider 或者 Service 访问一个数据库。下面会详细讲解如果创建数据库,添加数据和查询数据库。   创建数据库   Android 不自动提供数据库。在 Android 应用程序中使用 SQPte,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQPteOpenHelper 帮助你创建一个数据库,你只要继承 SQPteOpenHelper 类,就可以轻松的创建数据库。SQPteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQPteOpenHelper 的子类,至少需要实现三个方法:   构造函数,调用父类 SQPteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通......余下全文>>


九.android中的数据库怎么去写?如何建表,希望有具体代码参考啊!

android 中的数据库操作 android 中的应用开发很难避免不去使用数据库, 聊聊 android 中的数据 库操作,我发给你 word 贴不下
一、android 内的数据库的基础知识介绍
1.用了什么数据库
android 中采用的数据库是 SQLite 这个轻量级的嵌入式开源数据库,它是用 c 语言构建的。相关简介可以从链接查看。
2.数据库基本知识观花
对于一些和我一样还没有真正系统学习数据库技术的同学来说,把 SQL92 标 准中的一些基本概念、基本语句快速的了解一下,是很有必要的,这样待会用 Android 的 database 相关方法去执行一些数据库语句时就不会茫然了。
①数据库的基本结构——表格
表格是数据库中储存资料的基本架构。表格被分为栏位 (column) 及列位 (row)。每 一列代表一笔资料,而每一栏代表一笔资料的一部份。举例来说,如果我们有一个记载顾客 资料的表格,那栏位就有可能包括姓、名、地址、城市、国家、生日..等等。每一个表格 . 拥有一个独一无二的名字(Table Name)以便能够让用户定位到它上面。一个典型的表格结 构如下:
Store_Information 表格
store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 Los Angeles $300 Jan-08-1999 Boston $700 Jan-08-1999 该表格的表格名字为 Store_Inf护处篙肺蕻镀戈僧恭吉ormation, 一共有三个栏位, 分别为 store_name , Sales , Data , 已经录入了四笔数据所以有四个列位。
②关于数据类型
和其他的数据库不同的是,sqlite 是无类型的。也就是当你创建一个表格时,无需对 每一个栏位要存储的数据的类型进行声明,当你在给表格增加数据条目时,sqlite 会自动找 到存入的数据的类型。
SQLite 允许忽略数据类型,但是,仍然建议在 Create Table 语句中指定数据类型, 因为数据类型有利于增强程序的可读性。SQLite 支持常见的数据类型,如 VARCHAR、 NVARCHAR、TEXT、INTEGER、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、 NUMERIC、VARYING、CHARACTER、NATl0NAI, VARYINGCHARACTER。这些数据类 型都是 SQL92 标准中规定的标准数据库数据类型,想要有更近一步了解,请参看下表。
SQL 数据库数据类型详解 数据类型 类型 描 述 bit 整型 bit 数据类型是整型,其值只能是 0、1 或空值。这种数据类型用于存储只有两 种可能值的数据,如 Yes 或 No、True 或 Fa lse 、On 或 Off int 整型 int 数据类型可以存储从- 231(-2147483648)到 231 (2147483 647)之间的整数。存 储到数据库的几乎所有数值型的数据都可以用这种数据类型。 这种数据类型在数据库里占用 4 个字节 smallint 整型 smallint 数据类型可以存储从- 215(-32768)到 215(32767)之间的整数。这种 数据类型对存储一些常限定在特定范围内的数值型数据非常有用。 这种数据类型在数据库里 占用 2 ......余下全文>>


十.android中怎么创建一个表格?

1L,JDBC是针对数据库的,楼主要的是现成的UI吧。。,给你说一个最好的方式,自己重写GridView,然后定义好适配器,就可以了!!常丹败柑汁纺伴尸宝建这是一种方式,再一个就是继承view类,自己去画出来吧!

android 动态建数据库表 蓝鸥:Android SQLite数据库增加 删除 修改 查询由美文导刊网(www.eorder.net.cn)收集整理,转载请注明出处!原文地址http://www.eorder.net.cn/pic60250/

文章评论
Copyright © 2006 - 2016 www.eorder.net.cn All Rights Reserved
美文导刊网 版权所有