安卓手机开发之Sqlite 数据应用与初始化

 更新时间:2016年9月20日 20:00  点击:1427
本文章介绍了Android Sqlite 数据应用与初始化,有需要的同学可参考一下

创建数据库

Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:

•构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。
•onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。
•onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。
下面示例代码展示了如何继承 SQLiteOpenHelper 创建数据库:

 代码如下 复制代码

 public class DatabaseHelper extends SQLiteOpenHelper {    
  DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)
  {    
    super(context, name, cursorFactory, version);    
     }    
    
     @Override   
     public void onCreate(SQLiteDatabase db) {    
         // TODO 创建数据库后,对数据库的操作    
     }    
    
     @Override   
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    
         // TODO 更改数据库版本的操作    
     }    
    
 @Override   
 public void onOpen(SQLiteDatabase db) {    
         super.onOpen(db);      
         // TODO 每次成功打开数据库后首先被执行    
     }    
 }    
 


接下来讨论具体如何创建表、插入数据、删除表等等。调用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQLiteDatabase 实例,具体调用那个方法,取决于你是否需要改变数据库的内容:

 

 代码如下 复制代码
db=(new DatabaseHelper(getContext())).getWritableDatabase();
 return (db == null) ? false : true;

 


上面这段代码会返回一个 SQLiteDatabase 类的实例,使用这个对象,你就可以查询或者修改数据库。

当你完成了对数据库的操作(例如你的 Activity 已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。

android系统下每个程序的数据存放在 /data/data/(package name)/ 目录下,数据库则是在/dababases/目录下..
所以,你只要用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录就可以了..

操作方法:
1. 把原数据库包括在项目源码的 res/raw 目录下.
2.创建一个类来控制database..如下:


代码

 代码如下 复制代码

public class DatabaseManager{
                private final int BUFFER_SIZE = 400000;
                public static final String DB_NAME = "myDatabase.db"; //保存的数据库文件名
                public static final String PACKAGE_NAME = "com.android.ImportDBTest";//包名
                public static final String DB_PATH = "/data"
                     + Environment.getDataDirectory().getAbsolutePath() + "/"
                     + PACKAGE_NAME; //在手机里存放数据库的位置

                private SQLiteDatabase database;
                private Context context;

                DBManager(Context context) {
                     this.context = context;
                }

                public void openDatabase() {
                     this.database = this.openDatabase(DB_PATH + "/" + DB_NAME);
                }

                private SQLiteDatabase openDatabase(String dbfile) {
                     try {
                     if (!(new File(dbfile).exists())) {  //判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库
                     InputStream is = this.context.getResources().openRawResource(
                     R.raw.myDatabase); //欲导入的数据库
                     FileOutputStream fos = new FileOutputStream(dbfile);
                     byte[] buffer = new byte[BUFFER_SIZE];
                     int count = 0;
                     while ((count = is.read(buffer)) > 0) {
                     fos.write(buffer, 0, count);
                     }
                     fos.close();
                     is.close();
                     }
                     SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,
                     null);
                     return db;
                     } catch (FileNotFoundException e) {
                     Log.e("Database", "File not found");
                     e.printStackTrace();
                     } catch (IOException e) {
                     Log.e("Database", "IO exception");
                     e.printStackTrace();
                     }
                     return null;
}

然后在需要用到数据库的时候,用实例化一个DatabaseManager类,调用其openDatabase方法就可以返回一个
SQLiteDatabase对象了..如下:
代码

 代码如下 复制代码

SQLiteDatabase db = new DBManager(this).openDatabase();


这里只是安卓手机开发的一个角

Android中删除文件名显示乱码的文件方法 有需要的朋友可参考一下

原意是备份一个hosts文件,然后修改hosts的内容的(作用大家懂的),用RE复制,然后粘贴就出现这个乱码的文件了,用RE删,提示删除成功,但再次进入/etc又会出现这个文件,我删了N次这个文件都阴魂不散,彻底晕倒了。

 

由于hosts文件在手机rom中,把手机接上电脑只能看到TF卡上的内容,所以只能在手机上想办法了。

 

最后,解决办法是通过终端(shell)把它OK掉(删掉),估计用USB接到电脑用adb shell也可以,我没试验过。

 

手机需要装上的软件如下:

Better Terminal Emulator(超级终端)

 

 

Root Explorer(简称RE)

 

 

 

超级终端的好处是基本与linux的终端一致,可以用tab键自动补全路径(重点),在超级终端中tab键是 控制键+数字键9 ,我把控制键设为音量放大键,所以是按 音量放大键+9

自动补全路径:例如路径是/usr/bin/autostart.sh

那么输入/usr/bin/aut 按tab就能补全为 /usr/bin/autostart.sh

这样就能使不能输入的乱码字符自动补上了

 

步聚:

1、打开终端后用 ls 命令查看要删除的文件名

ls -a 文件路径

-a 表示显示隐藏文件

eg: ls -a /etc/

 

2、用 rm 命令删除文件,如果路径存在空格则要用双引号(”")把路径括起来。

rm -f 文件路径

-f  不询问直接删除

eg: rm -f “/etc/hosts -乱码部份”

如果提示 read-only system,则用RE挂载为读写。

以上,折腾完毕。(原文:安卓主题下载网)

在AlertDialog中使用自定义的View,如果View中有EditText,在上面点击,默认是跳不出软键盘的,不是焦点的问题。 解决方法,有两种,一是把AlertDialog换成Dialog,但这么一来,对话框的最外层会多出一个框,顶部还会空几十个DP,当然可以用setBackgroundDrawable(new ColorDrawable(0))把背景设为透明,隐藏掉边框,但是上面空着的几十个DP还在,对话框就不是在屏幕居中了。

代码:

 代码如下 复制代码

Dialog ad = new Dialog(context);
ad.show();
Window window = ad.getWindow();
window.setBackgroundDrawable(new ColorDrawable(0)); 
window.setContentView(R.layout.cancel_sos_dialog);

最好的办法是第二种:

 代码如下 复制代码
 AlertDialog ad =  new AlertDialog.Builder(context).create();
ad.setView(ManagerDialogLayout_.build(context,ad));
ad.show();
Window window = ad.getWindow();
window.setContentView(ManagerDialogLayout_.build(context,ad));

在调用show方法前先调用setView(layout),show后再调用window.setContentView(layout),两个Layout布局应该是相同的。
至于原因,暂时不明,但是确实解决了问题,在EditText上点击,可以调出软键盘,输入法了。

Android 开发 绘制圆角距形背景实现程序,有需要学习安卓开发的朋友可参考本文章。

需要圆角距形的背景,可是直接用一终圆角的图片,但是因为Android屏幕分辨率太乱,为了能适应所有的分辨率,我们不可能事确定好宽度,虽然可以用draw9patch,但我一直没掌握那工具的用法,做出来的图片最终还是变形,但用下面的方法就永远不会变形,因为没有用图片,是用Android直接绘图.
最终的效果图:

新建一个drawable的xml文件,这里名为server_setting_bg:

 代码如下 复制代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 边缘线的宽度和颜色 -->
    <stroke android:width="1px" android:color="#7d7a7a" />
    <!-- 中间的背景色 -->
    <solid android:color="#e4e4e4"/>
    <!-- 设置四个角的角度 -->
   <corners android:topLeftRadius="10dp" android:topRightRadius="10dp" android:bottomLeftRadius="10dp" android:bottomRightRadius="10dp"/>
</shape>

 
调用方法:

 代码如下 复制代码

<LinearLayout
 android:layout_width="fill_parent"
android:layout_height="300dp"
 android:layout_marginLeft="10dp"
  android:layout_marginRight="10dp"
 android:layout_marginTop="20dp"
  android:background="@drawable/server_setting_bg"
android:orientation="vertical" >
 </LinearLayout>

Android应用程序会通过一个工具将应用所有的CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从其中读取指令和数据。

Android 是Google开发的基于Linux平台的开源手机操作系统,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行,这个系统发布后大大的方便了用户的需求。

每一个Android 应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理。Mutex等等都是依赖底层操作系统而实现的。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。

不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度的保护应用的安全和独立运行。Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。

这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时。Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。

应用程序包(APK)被发布到手机上后,运行前会对其中的DEX文件进行优化,优化后的文件被保存到缓存区域(优化后的格式被称为DEY),虚拟机会直接执行该文件。如果应用包文件不发生变化,DEY文件不会被重新生成。

Android应用程序所使用的编程语言是Java语言,和Java SE一样,编译时使用Sun JDK将Java源程序编程成标准的Java字节码文件(.class文件)。而后通过工具软件DX把所有的字节码文件转成DEX文件(classes.dex)。

[!--infotagslink--]

相关文章