- 浏览: 434870 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
weiwu83:
为什么我在手机内访问127.0.0.1访问不了呀
NanoHttpd 构建android 手机端的HttpServer -
jiae:
为啥我的插入语句乱码? 但是可以插入数据库 然后复制你 ...
SQLite3 在应用启动时初始化数据 -
lichenxiao77:
...
android 连接远程数据库 -
林源滔:
为什么我make clobber之后第一次执行make 可以。 ...
No rule to make target `out/target/common/obj/JAVA_LIBRARIES/bouncycastle_in -
cn23snyga:
new String(str.getBytes("I ...
android 平台上SQLite3中文乱码 --我的小bug
今天想实现一个功能,即在应用安装初始化时,创建本地数据库,同时为数据库添加数据,之后再从数据库中读取数据。
1 首先需要写一个类实现android中的SQLiteOpenHelper类。代码如下:
public class DatabaseHelper extends SQLiteOpenHelper { /** *DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能 *第一,getReadableDatabase(),getWritableDAtabase()可以获得SQLiteDatabase对象,通过该对象可以对数据库进行操作 *第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作 */ private static final int VERSION=1;// 数据库版本 private static final String NAME="oil.db";//数据库名 public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } public DatabaseHelper(Context context, String name, int version) { this(context, name, null, version); } public DatabaseHelper(Context context) { this(context, NAME, VERSION); } String sql = "CREATE TABLE IF NOT EXISTS car ( _id VARCHAR(50) primary key ," + "company_name VARCHAR(50) , " + "type VARCHAR(50) , " + " general_name VARCHAR(50) ," + "transmission VARCHAR(50) , " + " emission VARCHAR(50)," + "city_consume VARCHAR(50) , " + "suburban_consume VARCHAR(50) ," + "total_consume VARCHAR(50)," + "factor VARCHAR(50)) ;"; //该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabase对象的时候, //才会调用这个方法 @Override public void onCreate(SQLiteDatabase db) { //创建表 db.execSQL(sql) ; System.out.println("create a database"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { System.out.println("update a database"); } }
2.判断数据库表中是否有数据,这个可以区分出是否已经对表进行填充了。这个是在CarService中实现的。
CarService中的构造方法:
private DatabaseHelper openHelper; private SQLiteDatabase sqliteDatabase; private Context mcontext; public CarService(Context context) { //传递上下文对象 mcontext=context; this.openHelper = new DatabaseHelper(context); //得到只读的对象 // sqliteDatabase = openHelper.getReadableDatabase(); if (isExist()) {// 若表中数据为空,则执行插入。 try { initInsert();// 插入初始化数据 } catch (IOException e) { e.printStackTrace(); } } }
之后是实现方法:
//判断数据库表中是否有数据 public boolean isExist(){ boolean result = true; String sql = "select count(*) count from car"; //sqliteDatabase = sqliteDatabase.openOrCreateDatabase(sql, null); sqliteDatabase = openHelper.getReadableDatabase(); Cursor cursor = sqliteDatabase.rawQuery(sql, null); //System.out.println(cursor.get); if (cursor.moveToNext() ) { int count = cursor.getInt(0); if(count>0){//存在数据 result = false; } cursor.close(); sqliteDatabase.close(); } return result; }
3 开始往空表中填充数据。这个实现思路是直接把一个文件中的数据(大概1k条左右)写进数据库,因为数据量稍微多点,所以使用事务进行添加。同时这个数据文件car.sql是放在res/raw/文件夹下。我试过跟类放在一起我找不到文件。如果有同志实现了,可以交流下。呵呵。
/** * 通过读取文件,插入初始化数据 * @throws IOException */ public void initInsert() throws IOException { InputStreamReader reader = new InputStreamReader( mcontext.getResources().openRawResource(R.raw.cardata)); BufferedReader br = new BufferedReader(reader); String s1 = ""; sqliteDatabase = openHelper.getWritableDatabase(); //通过事务,进行批量插入 sqliteDatabase.beginTransaction(); while ((s1 = br.readLine()) != null) { //System.out.println(s1); String sql = s1; //System.out.println("sql---"+sql); sqliteDatabase.execSQL(sql); } sqliteDatabase.setTransactionSuccessful(); sqliteDatabase.endTransaction(); br.close(); reader.close(); sqliteDatabase.close(); }
我是用按行读取的,比较简便。嘿嘿难一点的,你们自己试吧。
4之后就是查询了。
public List<Car> getCompanyList(long startIndex, long maxCount) throws UnsupportedEncodingException { //路径/data/data/jw.oil/files /* String path=mcontext.getFilesDir().getPath().substring(0); System.out.println(path);*/ String sql = "SELECT DISTINCT(company_name) company_name FROM car "; //String[] selectionArgs = { String.valueOf(startIndex), String.valueOf(maxCount) }; sqliteDatabase = openHelper.getReadableDatabase(); Cursor cursor = sqliteDatabase.rawQuery(sql, null); List<Car> cars = new ArrayList<Car>(); if (cursor.getCount() != 0) {// 如果有数据 while (cursor.moveToNext()) { Car car = new Car(); car.setCompany_name(cursor.getString(0)); System.out.println("----" + car.getCompany_name()); cars.add(car); } cursor.close(); sqliteDatabase.close();//关闭数据库 } else { cars = null; } return cars; }
如果填充数据没错,就出现效果了。
出现问题:因为总是测试,很多时候使用命令行查看数据库。删除应用的时候,只是删除文件夹。有好几次在程序初始化时都会报错:unable to open database file
查了很多资料,最后才明白是自己的应用没有删干净。建议用模拟器自带的卸载管理。
发表评论
-
Android.mk文件解析
2016-01-27 14:01 918以 tools/tradefederation/Androi ... -
NanoHttpd 构建android 手机端的HttpServer
2015-10-20 16:24 2929NanoHttpd是Github上的一个开源项目, 通过下载 ... -
permission denial : android.permission.INTERACT_ACROSS_USERS_FULL
2015-08-05 16:50 5038在android5.0上运行 Runtime.getRun ... -
android getprop() 和 java System.getPropety()
2015-06-04 14:39 63401 System.getPropety()是java中的方 ... -
android cts测试相关
2015-05-27 17:38 0example: -
android uiautomator 相关
2015-05-15 16:53 16891 Runtime.getRuntime().exec 启 ... -
android UI test Espresso
2015-04-10 18:31 1196google android UI测试工具 espresso ... -
android 安全(转)
2014-12-26 12:37 719一 如何不被反编译解析1防止反编译工具的反编译 查看 ... -
nexus related
2014-12-17 15:29 7341 nexus drivers https://deve ... -
git related
2014-12-17 15:24 9601 see all detailed git info ... -
ubuntu android studio 配置和使用
2014-12-10 17:34 3623Ubuntu 64位,Android studio 的安装, ... -
eclipse+ADT+android配置相关
2014-12-05 16:40 14441 eclipse 过旧时,ant 运行不了,会报sdk. ... -
anroid 开发小知识点
2014-10-09 09:52 8191 1)代码 获取APK安装路径和包名 L ... -
androird 内存泄露 浅析
2013-06-19 17:52 1439主要是记录工作中出 ... -
java层堆栈调用的打印
2012-12-26 15:14 44641. 在指定的函数内打印相关java调用 Log.d ... -
sms AT指令返回错误代码: CMS errors & CME errors 的区别!
2012-10-26 18:35 12004CMS的是短信中心的返回错误。 CME 是设备返 ... -
sms 发送 radio log
2012-10-26 17:25 4062发送短信:radio.log 关键字 :SEND_SMS ... -
SQLite --函数
2012-09-03 18:22 1970一、日期和时间函数:原文地址SQLite主要支持以下 ... -
Low memory killer
2012-08-09 11:47 16141,引入原因 Android是一个多任务系统,也 ... -
OTA 文档地址 及开发
2012-07-06 13:18 1723[OTA]制作OTA短信来配置手机与服务器同步 ...
相关推荐
在Android应用启动时初始化数据,通常会在应用程序的生命周期中找到合适的时机来执行。在这个例子中,作者通过一个名为`BilldbHelper`的辅助类来完成初始化工作。`BilldbHelper`可能继承自`SQLiteOpenHelper`,这是...
初始化工具可以帮助开发者在应用启动时就检查并请求必要的权限。 7. **全局变量和配置设置**:应用可能会有一些全局变量或配置文件需要在启动时读取。初始化工具可以提供一个统一的地方来处理这些设置。 8. **性能...
在这个项目中,开发者可能已经设置了SQLite3的初始化、数据库的打开和关闭、查询执行等操作。 `test.db3`是SQLite3的数据库文件,它包含了实际的数据。Delphi应用可以通过封装好的组件或类来读取、写入这个数据库。...
在Electron应用中,SQLite3可以用于存储用户数据或应用配置,方便离线环境的数据管理。通过Node.js的sqlite3库,开发者可以轻松地在JavaScript中操作数据库,进行增删查改等操作。 在这个基础框架中,所有这些组件...
在Python的Web开发领域,Flask是一个轻量级的Web应用框架,而sqlite3则是Python标准库中的一个模块,用于处理嵌入式SQL数据库。这个名为“Python-使用Flask和sqlite3编写的项目目录应用程序”的项目,显然是利用这...
在Quartz 2.2.3版本中,初始化数据库是使用Quartz的关键步骤,因为Quartz依赖于一个持久化存储来保存作业和触发器的信息。这个过程通常涉及执行一系列SQL语句来创建必要的表结构。 Quartz的初始化SQL语句主要用于...
2. **初始化LitePal**:在应用启动时,需要调用`LitePalApplication`或自定义的`Application`类中的`LitePal.initialize()`方法进行初始化。 3. **自动建表**:当应用首次运行时,LitePal会根据已定义的Java类自动...
2. **初始化**:在应用程序启动时,配置SQLite连接字符串,指定加密参数(如密钥)。 3. **创建/打开加密数据库**:使用加密库提供的API创建一个新的加密数据库,或者打开已有的加密数据库。 4. **读写操作**:执行...
1. **初始化数据库连接**:首先,程序需要加载SQLite3库并打开一个到数据库文件的连接。这通常通过`sqlite3_open()`函数完成,需要提供数据库文件的路径作为参数。 2. **构造SQL语句**:根据HTTP请求的内容,程序...
1. 初始化:在应用启动时,需要初始化SQLCipher,设置数据库的加密密钥。这可以通过调用`sqlite3_key()`或`sqlite3_rekey()`函数完成。 2. 连接数据库:创建或打开SQLite数据库时,需要使用SQLCipher提供的API,而...
在这里,它可能包含了初始化SQLite3库、创建数据库连接以及启动应用程序的相关代码。 3. **SQLite3.dproj**:这是Delphi项目的配置文件,记录了编译器设置、库路径、依赖项等信息,用于构建和管理项目。 4. **...
在博文链接中,你可能会找到如何配置和使用Tomcat Embedded以及SQLite的具体代码示例,包括如何在Tomcat启动时自动初始化数据库,以及如何在Web应用中处理数据库操作。 **工具** 提到的“工具”标签可能指的是使用...
- 重写`SQLiteOpenHelper`的`onCreate()`和`onUpgrade()`方法,`onCreate()`通常用于首次创建数据库时执行的初始化操作,`onUpgrade()`则在数据库版本升级时调用。 - 在你的数据库帮助类中,定义一个`copyDatabase...
这可以通过将.db文件放入应用的assets目录下,然后在应用启动时复制到数据库路径中完成。以下是如何实现这个过程的代码片段: ```java private void copyDatabaseFromAssets(Context context) { try { ...
在使用这两个类时,开发者首先要确保在应用的合适时机(如应用程序启动时)初始化`DbManager`,然后通过`DbManager`获取到相应的DAO实例。DAO提供了各种操作数据库的方法,如插入数据、查询数据、更新数据和删除数据...
最后,你会学习到如何在应用启动时自动打开数据库,关闭时保存未提交的更改,并妥善处理可能的异常。此外,还将涉及数据持久化和备份策略,以及如何在多线程环境中安全地使用SQLite3。 总结,Linux下的Qt4与SQLite3...
2. **.sql脚本文件**:虽然压缩包中没有明确的.sql文件,但通常情况下,你可以使用sqlite3.exe来运行这些脚本,批量执行数据库初始化、数据导入导出或结构更改等任务。 3. **sqlite3_analyzer.exe**:这是一个分析...
2. **数据库初始化**:在代码中,你需要创建一个SQLite数据库实例,这通常是在游戏启动时进行的。你可以定义数据库的名称和版本,并执行必要的初始化脚本来创建所需的表和结构。 3. **数据库操作**:SQLite插件提供...