问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

读取sqlite数据库时用SQLiteDataAdapter填充Datatable时遇到的问题。

发布网友 发布时间:2022-04-09 01:35

我来回答

3个回答

懂视网 时间:2022-04-09 05:56

      我们在严谨地操作数据库的时候,总会遇到这种情况,程序重新启动后,已经建立的数据库表,不需再次建立。在项目之初,用到Android本地数据库SQLiteDatabase时候,也遇到了这个情况。遍览其方法,仅有findEditTable可能有此功能,所以做了以下实验:

String tableName = "";
tableName= mSqliteDatabase.findEditTable(TABLENAME);//此函数有bug
Log.i("ln","result = " + tableName);

if (tableName == null || tableName.equals("")){
 mSqliteDatabase.execSQL("create TABLE "+ TABLENAME +"(_id INTEGER PRIMARY KEY AUTOINCREMENT, "+COLUMN_USERNAME +" VARCHAR(50) NOT NULL,"+ COLUMN_USERADDRESS +" VARCHAR(50))");
}else {
 Log.i("ln","The table has been created.");
}

注:private static final TABLENAME = "user";


2. 问题

     可多次实验,在表格 user尚未建立时,调用findEditTable方法,程序坚定地返回 “user”。这就导致表格无法真实在数据库中建立,后续的数据库操作无法进行。

05-10 02:45:59.124 3649-3649/com.ln.dbstorage I/ln: result = user 
05-10 02:45:59.125 3649-3649/com.ln.dbstorage I/ln: The table has been created.

3. 缘由

     我预感到缘由有可能处在源代码里面,所以就打开SQLiteDatabase的源码一看究竟。请看源码中关于findEditTable的部分。

/**
 * Finds the name of the first table, which is editable.
 *
 * @param tables a list of tables
 * @return the first table listed
 */
  public static String findEditTable(String tables) {
  if (!TextUtils.isEmpty(tables)) {
   // find the first word terminated by either a space or a comma
   int spacepos = tables.indexOf(‘ ‘);
   int commapos = tables.indexOf(‘,‘);

   if (spacepos > 0 && (spacepos < commapos || commapos < 0)) {
   return tables.substring(0, spacepos);
   } else if (commapos > 0 && (commapos < spacepos || spacepos < 0) ) {
   return tables.substring(0, commapos);
   }
   return tables;
  } else {
   throw new IllegalStateException("Invalid tables");
  }
  }
看到这里,情况就一目了然了。

4. 方案

     想必码友们都了解,sqlite的“.tables”命令,可以查到所有的现有表格名。我考虑数据库里或许有保存所有表格信息的表。很幸运地,sqlite_master出现在我的视线。于是就有了我们以下的解决方案。


//根据表明取得表
Cursor cursor = mSqliteDatabase.rawQuery("SELECT * FROM sqlite_master where tbl_name = ? ",new String[]{TABLENAME});
Log.i("ln","table num : " + cursor.getCount());

运行结果如下:


05-10 03:01:52.711 30008-30008/com.ln.dbstorage I/ln: table num : 0


5. 解决

Cursor cursor = mSqliteDatabase.rawQuery("SELECT * FROM sqlite_master where tbl_name = ? ",new String[]{TABLENAME});
Log.i("ln","table num : " + cursor.getCount());  
if (cursor.getCount()!= 1){
 mSqliteDatabase.execSQL("create TABLE "+ TABLENAME +"(_id INTEGER PRIMARY KEY AUTOINCREMENT, "+COLUMN_USERNAME +" VARCHAR(50) NOT NULL,"+ COLUMN_USERADDRESS +" VARCHAR(50))");
}else {
 Log.i("ln","The table has been created.");
}

      

——2016.5.10 于郑州

对SqliteDatabase.findEditTable的改进

标签:

热心网友 时间:2022-04-09 03:04

那你查一下DateTime的字段是否为空值,如果为空值那么在填充到DataTable时得设置一个默认值,否则就会出现你所说的错误。
另外,如果你在读取DateTime字段时是使用dr.GetDateTime(1)这种方式读取的,那么得确保DateTime字段不为空值,否则读取时也会出现你所说的错误

热心网友 时间:2022-04-09 04:22

SQLite的时间类型并不与DataTable的时间类型一致,所以报错
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
水笔在手上画画会不会被衣服搽掉下来 老人每天大便次数很多量不多也不稀,每天还会拉三四次水应经三个月了... 从大连飞机场怎么去大连经济开发区5彩城K区的大连金港大酒店 除了打 ... 请问从大连周水子国际机场到经济技术开发区怎么走最省钱? 中国古代名刀总录中国古代十大名刀 怎样把qq安装到iphone里面 苏科大什么梗 苏科大叫什么名字 lol苏科大是苏州科技大学的吗 lol苏州科技大学为什么这么厉害 优尔精医用降温贴是不是保健品? 中年女人梦见一条大黑狗抖自己玩是什么意思? 银河微盘中的止盈止损是什么意思 美股为什么手续费很高,美股是按每笔记算的每笔的手续费是19美元一29美元,手续费这费有什么作用。是 在美国开立股票账户需要什么手续?手续费、税率怎样?是否每个州也有不同? 股指期货配资什么平台好一点? 哪些外汇平台股指有200杠杆上? 电影首映跟上映有什么区别? 请问电影中首映和公映的区别是什么? 首映和上映有什么区别? 电影的首映和公映一样么?有什么区别? 湖北国考公务员培训班什么时候有? 公务员国考笔试培训班一般什么时候开始开? 2014国考面试有培训班吗?具体什么时间啊? 中公教育什么时候有国考培训班? 中公教育的国考笔试班什么时候开始? 请教一下,我把大葱叶子洗净后切段放塑料袋放冰箱冷冻,熬鱼或炖肉时用,这样可以吗? 葱子洗净切粒后水分未干放冰箱会腐烂吗? 涨乐财富通哪里可以看新债转股价值? 债权人委托债务公司追债合法吗 美国定增,债转股怎样 为什么供销社当年被赶回家的职工养老保险问题没人管呢? 原供销社下岗职工全民合同工7年后下岗,退休后有过渡养老金吗? 为什么腾讯这么大的公司没有客服?是个性吗? 为什么腾讯永远没有人工客服? 蜂蜜的真假如何判断? 腾讯人工客服电话怎么打不进去? 美的净水器出现e1是什么意思 我买了台美的净水器,制出的水ppm值是42,请问正常吗? 美的净水器PP棉的指示灯不亮,换了后也不亮是什么原因 美的净水器的功能显示一般都在哪里? 美的净水器进水显示999是什么意思? 美的净水器ro pcb是什么意思 美的净水器出的水是什么性?PH值多少? 飞信怎么开通? 晚上水果吃到撑会怎么样? 如何开通飞信? 孩子晚上水果吃多了吐了怎么办 飞信怎么开通 吃水果吃多了怎么办 如何开通飞信