操作外部数据库 从.sql转换开始·

最近楼主换了一家公司,好不习惯的说。习惯了之前公司的后台给处理数据,习惯了拿到现成的东西去添枝加叶,习惯吃饭的时候张口美女给喂...哈哈,言归正传

这几天公司给安排接手了一个项目, 客户那边提供的数据源,一顿沟通下来, 客户那边没办法直接提供android操作的数据库文件,他们是oracle数据库,所以只能导出.sql文件。 嗯,好吧, 明显需要我来处理一下数据,作为一个从来不处理后台数据的我。唉·此时的心情,如下图:

嗯哼·.jpg
  • 转换成.db文件,整理后分为以下几步:

    1.什么都不说,先打开sql文件,看看是个什么样子。

    2.自己建个txt文件,utf-8格式的。 复制create建表语句,以及insert的数据源。一些oracle自带函数不进行复制。随后保存为.sql文件。

    3.新建一个db文件,作为手机端操作的数据库

    4.SQLite Expert Personal 3这个软件用来进行db数据库的操作。

    5.执行.sql文件,执行语句完毕走人··

一 、这是.sql数据源

set feedback off
set define off
prompt Creating XTGL_DEPARTMENT...
create table XTGL_DEPARTMENT
(
  bmid   NVARCHAR2(64),
  id     NVARCHAR2(64) not null,
  name   NVARCHAR2(64),
  parent NVARCHAR2(64),
  unit   NVARCHAR2(200),
  desr   NVARCHAR2(200)
)
;

prompt Loading XTGL_DEPARTMENT...
insert into XTGL_DEPARTMENT (bmid, id, name, parent, unit, desr)
values ('E62B4AFE556CC6AEE0', '2110135', 'name', '21101360700', '36211013600002110136075', null);
insert into XTGL_DEPARTMENT (bmid, id, name, parent, unit, desr)
values ('E62B4AFE556CC6AEE0', '21106', '公路管理局安', '21101360700', '36211013600002110136', null);
insert into XTGL_DEPARTMENT (bmid, id, name, parent, unit, desr)
values ('E62B4AFE556CC6AEE0', '211017', '公路分局', '21101360700', '36211013600002110136', null);
commit;
prompt 123 records loaded
  • 直接右键文本打开就行,能直接看的。我这里就随便插点数据,表示一下大概意思就好。

二、txt文本的一系列操作

txt.png
  • 桌面上新建一个txt文档, 左侧的是我的.sql数据,右侧是我的txt文本。
    右键打开txt文件。

三、复制语句

txt.png
  • 只复制sql语句,多余的不要复制,有些函数只存在于oracle,转换的过程中运行sql会报错。蓝色我圈起来的,就是举个例子,像todate这样的,客户那边调用的函数,我们是没办法识别的。 所以还需要跟客户沟通这样的数据如何处理。


    image.png
  • 文本另存为, 编码格式为utf-8,不要整错格式了。而后缀名也记得改成.sql文件。
    这里是为了后续的执行sql。

三、新建一个db文件

db.png
  • 新建个db文件,打开SQLite Expert Personal 3这个软件。
    http://www.onlinedown.net/soft/117987.htm 这个地址可以下这个软件,在最下面下载。 打开刚才新建的db文件,会生成一个db数据库,但是这个数据库没有表。对的,要是的就是这样。

四、执行sql语句

sql.png
  • 记得右侧的栏目要选择到sql上,打开上方的sql菜单,才会让你可以点击load Sql script


    sql2.png
  • 加载选择之前的demo.sql文件,然后运行sql语句。就直接插入到表里了,效果图如下:


    over我是效果图.png

以上就是转换的全过程,这样之后我就可以直接操作db文件,来进行手机端的本地数据的操作。
\n
\n


以下是操作外部数据库

我用的greendao数据库框架· 你也可以用别的,基本理论上都是一样的。话不多说,直接上代码。

  • greendao的集成
app.gradle中:
apply plugin: 'org.greenrobot.greendao' // 添加应用依赖插件
 

greendao{
        schemaVersion 1 //每次新增表需要 更改数据库版本·
        daoPackage'com.hdsx.ncgl.greendb.gen'//包名下对应的green的根目录,用来greendao生成对应的Dao实例
        targetGenDir'src/main/java'
    }

   //数据库
    compile 'org.greenrobot:greendao:3.2.2'
  
//版本号 那个类添加
   classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // 添加插件 更好支持GreenDao

因为是操作的外部数据库,所以我们不需要新建表的。而是使用数据库已经存在的表,所以需要映射一下,具体操作如下:


image.png

@Entity 对应表 nameInDb映射的名称。createInDb = false,不需要在重新建表。
@Property字段 nameInDb字段映射的名称。
注意: 映射的时候,不需要自己新增Long id什么的, 需要同步 数据库表,一模一样。

操作完了之后,记得build -->>make project一下,让greendao自动生成Dao实体。

  • 把最开始新建的那个db文件,复制到assets目录下。我们需要copy一份到手机本地,操作本地的数据库文件。
    ps:SQLite软件已经把数据插入到db文件里了,直接拿桌面上的db文件就好了,不需要操作 保存阿,或者别的一些别的操作。
在Application 类 做的操作。
//数据库
    private static DaoSession daoSession;
    private Database db;
    private String db_name = "ncgl.db";

    /*
        数据库
     */
    private void initLoginDB() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                InputStream in = null;
                FileOutputStream out = null;
                String path = "/data/data/" + getPackageName() + "/databases/";
                File file = new File(path + db_name);
                //创建文件夹
                File filePath = new File(path);

                Log.e("数据库路径", filePath.getAbsolutePath() + "");
                if (!filePath.exists()) {
                    filePath.mkdirs();
                    try {
                        in = getAssets().open(db_name); // 从assets目录下复制
                        out = new FileOutputStream(file);
                        int length = -1;
                        byte[] buf = new byte[1024];
                        while ((length = in.read(buf)) != -1) {
                            out.write(buf, 0, length);
                        }
                        out.flush();
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            if (in != null) in.close();
                            if (out != null) out.close();
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    }
                }
                //生成daoSession对象, 操作数据的对象。
                DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(mContext, "ncgl.db");
                db = helper.getWritableDb();
                DaoMaster daoMaster = new DaoMaster(db);
                daoSession = daoMaster.newSession();
            }
        }).start();
    }

    /*
        别的页面获取对象的时候,来操作数据库
     */
    public static DaoSession getDaoSession() {
        return daoSession;
    }
  • 这基本就完了, 接下来就是获取数据,或者操作数据了。
使用 :
   DaoSession daoSession = BaseApplication.getDaoSession();
        //查询所有的 数据。
        List<DepartMentForm> list = daoSession.getDepartMentFormDao().queryBuilder().list();
        //查询bmid 为 xx的数据,返回当前条件的所有数据。
        daoSession.getDepartMentFormDao().queryBuilder().where(DepartMentFormDao.Properties.Bmid.eq("xx")).list();
        //模糊查询name为张某的数据,返回集合。
        daoSession.getDepartMentFormDao().queryBuilder().where(DepartMentFormDao.Properties.Name.like("张_")).list();
        

提醒别忘了加权限哦,

好了好了,可算写完了,技术太菜望见谅,我是一名又懒又菜的猿。

是我.png

推荐阅读更多精彩内容