`
wangjunwj
  • 浏览: 38769 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

android sqlite 操作

阅读更多
作者:wangjunwj


介绍
在 Android 中使用 SQLite, ContentProvider 
数据库支持(SQLite) - Android 开发平台提供了操作 SQLite 数据库的相关 API
内容提供器(ContentProvider) - 当数据需要在应用程序之间共享时,可以在某程序中使用 ContentProvider 定义 URI, 以使其它应用程序可以通过此 URI 访问指定的数据


1、SQLite 的 Demo
DatabaseHelper.java

Java代码
代码  
package com.webabcd.SQLite; 
 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
 
// 数据库操作的 Helper 类 
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 每次成功打开数据库后首先被执行 
    } 

 
 
Main.java 
 
代码  
package com.webabcd.SQLite; 
 
import java.util.Random; 
 
import android.app.Activity; 
import android.content.ContentValues; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
 
public class Main extends Activity { 
 
    private DatabaseHelper dbHelper; 
 
    private static final String DATABASE_NAME = "db.db"; 
    private static final int DATABASE_VERSION = 1; 
    private static final String TABLE_NAME = "employee"; 
 
    TextView txtMsg; 
 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
 
        dbHelper = new DatabaseHelper(this, DATABASE_NAME, null, 
                DATABASE_VERSION); 
 
        txtMsg = (TextView) this.findViewById(R.id.txtMsg); 
 
        Button btn1 = (Button) this.findViewById(R.id.btn1); 
        btn1.setText("创建表"); 
        btn1.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                CreateTable(); 
            } 
        }); 
 
        Button btn2 = (Button) this.findViewById(R.id.btn2); 
        btn2.setText("插入 3 条记录"); 
        btn2.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                insertItem(); 
            } 
        }); 
 
        Button btn3 = (Button) this.findViewById(R.id.btn3); 
        btn3.setText("删除全部记录"); 
        btn3.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                deleteItem(); 
            } 
        }); 
 
        Button btn4 = (Button) this.findViewById(R.id.btn4); 
        btn4.setText("更新指定数据"); 
        btn4.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                updateItem(); 
            } 
        }); 
 
        Button btn5 = (Button) this.findViewById(R.id.btn5); 
        btn5.setText("显示全部数据"); 
        btn5.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                showItems(); 
            } 
        }); 
 
        Button btn6 = (Button) this.findViewById(R.id.btn6); 
        btn6.setText("删除表"); 
        btn6.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                dropTable(); 
            } 
        }); 
    } 
 
    // 创建数据表 
    private void CreateTable() { 
        SQLiteDatabase db = dbHelper.getWritableDatabase(); 
        String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME 
                + " (ID INTEGER PRIMARY KEY, Name VARCHAR, Age INTEGER);"; 
        try { 
            db.execSQL(sql); 
            txtMsg.append("数据表成功创建\n"); 
        } catch (SQLException ex) { 
            txtMsg.append("数据表创建错误\n" + ex.toString() + "\n"); 
        } 
    } 
 
    // 插入数据 
    private void insertItem() { 
        SQLiteDatabase db = dbHelper.getWritableDatabase(); 
         
        try { 
            Random random = new Random(); 
            for (int i = 0; i < 3; i++) { 
                String sql = "insert into " + TABLE_NAME 
                        + " (name, age) values ('name" + String.valueOf(i) 
                        + "', " + random.nextInt() + ")"; 
                // execSQL() - 执行指定的 sql 
                db.execSQL(sql); 
            } 
            txtMsg.append("成功插入 3 条数据\n"); 
        } catch (SQLException ex) { 
            txtMsg.append("插入数据失败\n" + ex.toString() + "\n"); 
        } 
    } 
 
    // 删除数据 
    private void deleteItem() { 
        try { 
            SQLiteDatabase db = dbHelper.getWritableDatabase(); 
            db.delete(TABLE_NAME, " id < 999999", null); 
            txtMsg.append("成功删除数据\n"); 
        } catch (SQLException e) { 
            txtMsg.append("删除数据失败\n"); 
        } 
    } 
 
    // 更新数据 
    private void updateItem() { 
        SQLiteDatabase db = dbHelper.getWritableDatabase(); 
 
        try { 
            ContentValues values = new ContentValues(); 
            values.put("name", "批量更新后的名字"); 
 
            db.update(TABLE_NAME, values, "id<?", new String[] { "3" }); 
            txtMsg.append("成功更新数据\n"); 
        } catch (SQLException e) { 
            txtMsg.append("更新数据失败\n"); 
        } 
    } 
 
    // 查询数据 
    private void showItems() { 
        SQLiteDatabase db = dbHelper.getReadableDatabase(); 
 
        try { 
            String[] column = { "id", "name", "age" }; 
            Cursor cursor = db.query(TABLE_NAME, column, null, null, null, 
                    null, null); 
            Integer num = cursor.getCount(); 
            txtMsg.append("共 " + Integer.toString(num) + " 条记录\n"); 
            cursor.moveToFirst(); 
 
            while (cursor.getPosition() != cursor.getCount()) { 
                txtMsg.append(Integer.toString(cursor.getPosition()) + "," 
                        + String.valueOf(cursor.getString(0)) + "," 
                        + cursor.getString(1) + "," 
                        + String.valueOf(cursor.getString(2)) + "\n"); 
                cursor.moveToNext(); 
            } 
        } catch (SQLException ex) { 
            txtMsg.append("读取数据失败\n" + ex.toString() + "\n"); 
        } 
    } 
 
    // 删除数据表 
    private void dropTable() { 
        SQLiteDatabase db = dbHelper.getWritableDatabase(); 
        String sql = "DROP TABLE IF EXISTS " + TABLE_NAME; 
        try { 
            db.execSQL(sql); 
            txtMsg.append("数据表删除成功\n"); 
        } catch (SQLException ex) { 
            txtMsg.append("数据表删除错误\n" + ex.toString() + "\n"); 
        } 
    } 

 
 
2、ContentProvider 的 Demo 
MyUser.java 
 
代码  
package com.webabcd.contentprovider; 
 
import android.net.Uri; 
import android.provider.BaseColumns; 
 
// 自定义 ContentProvider 所需的实体类 
public class MyUser { 
 
    // 必须要有 _id 字段。本例中 BaseColumn 类中已经包含了 _id 字段 
    public static final class User implements BaseColumns { 
         
        // 定义 CONTENT_URI 
        public static final Uri CONTENT_URI = Uri.parse("content://com.webabcd.MyContentProvider"); 
 
        // 表数据列 
        public static final String USER_NAME = "USER_NAME"; 
    } 

 
 
MyContentProvider.java 
 
代码  
package com.webabcd.contentprovider; 
 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
 
import org.apache.http.util.EncodingUtils; 
 
import android.content.ContentProvider; 
import android.content.ContentUris; 
import android.content.ContentValues; 
import android.database.Cursor; 
import android.database.MatrixCursor; 
import android.net.Uri; 
 
// 继承 ContentProvider 以实现自定义的 ContentProvider(基于文件的信息存储) 
public class MyContentProvider extends ContentProvider { 
 
    private File file; 
    private FileOutputStream out; 
    private FileInputStream in; 
 
    // ContentProvider 的删除数据接口 
    @Override 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
        // TODO Auto-generated method stub 
        return 0; 
    } 
 
    @Override 
    public String getType(Uri uri) { 
        // TODO Auto-generated method stub 
        return null; 
    } 
 
    // ContentProvider 的插入数据接口  
    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
 
        try { 
            out = new FileOutputStream(file); 
            out.write(values.getAsString(MyUser.User.USER_NAME).getBytes()); 
            out.close(); 
 
            int rowId = 0; 
            Uri rowUri = ContentUris.appendId( 
                    MyUser.User.CONTENT_URI.buildUpon(), rowId).build(); 
            getContext().getContentResolver().notifyChange(rowUri, null); 
 
            return rowUri; 
        } catch (Exception e) { 
            return null; 
        } 
    } 
 
    // 创建用于保存信息的文件 
    @Override 
    public boolean onCreate() { 
        try { 
            // 每个包中应用程序的私有目录为:/data/data/包名/ 
            // SD 卡目录为:/sdcard 
            file = new File("/data/data/com.webabcd.contentprovider/", 
                    "demo.txt"); 
            if (!file.exists()) 
                file.createNewFile(); 
 
            return true; 
        } catch (Exception ex) { 
            return false; 
        } 
    } 
 
    // ContentProvider 的查询数据接口 
    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, 
            String[] selectionArgs, String sortOrder) { 
         
        String content; 
 
        try { 
            in = new FileInputStream(file); 
            int length = (int) file.length(); 
            byte[] buffer = new byte[length]; 
            in.read(buffer, 0, length); 
            content = EncodingUtils.getString(buffer, "UTF-8"); 
            in.close(); 
 
            String[] columns = new String[] { MyUser.User._ID, MyUser.User.USER_NAME }; 
            MatrixCursor cur = new MatrixCursor(columns); 
            String[] values = new String[] { "0", content }; 
            cur.moveToFirst(); 
            cur.addRow(values); 
 
            return cur; 
        } catch (Exception e) { 
            return null; 
        } 
    } 
 
    // ContentProvider 的更新数据接口 
    @Override 
    public int update(Uri uri, ContentValues values, String selection, 
            String[] selectionArgs) { 
        // TODO Auto-generated method stub 
        return 0; 
    } 

 
 
Main.java 
 
代码  
package com.webabcd.contentprovider; 
 
import java.util.Random; 
 
import android.app.Activity; 
import android.content.ContentUris; 
import android.content.ContentValues; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.Contacts; 
import android.provider.Contacts.People; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 
 
/*
* 几个常用的系统内置的 ContentProvider 如下: 
* content://media/internal/images  这个URI将返回设备上存储的所有图片
* content://contacts/people/ 这个URI将返回设备上的所有联系人信息
* content://contacts/people/45 这个URI返回单个结果(联系人信息中ID为45的联系人记录)
*/ 
public class Main extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
 
        Button btn1 = (Button) this.findViewById(R.id.btn1); 
        btn1.setText("新增联系人记录"); 
        btn1.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                Random random = new Random(); 
                insertRecords("name" + String.valueOf(random.nextInt()), String 
                        .valueOf(random.nextInt())); 
            } 
        }); 
 
        Button btn2 = (Button) this.findViewById(R.id.btn2); 
        btn2.setText("查看联系人记录"); 
        btn2.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                displayRecords(); 
            } 
        }); 
 
        Button btn3 = (Button) this.findViewById(R.id.btn3); 
        btn3.setText("清除联系人记录"); 
        btn3.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                deleteRecords(); 
            } 
        }); 
 
        Button btn4 = (Button) this.findViewById(R.id.btn4); 
        btn4.setText("更新联系人记录"); 
        btn4.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                // 此处只是演示,id 来自 People._ID ,可参见 displayRecords() 是如何获取 id 的 
                int id = 0; 
                updateRecord(id, "修改后的name"); 
            } 
        }); 
 
        Button btn5 = (Button) this.findViewById(R.id.btn5); 
        btn5.setText("新增记录到 MyContentProvider"); 
        btn5.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                insertRecord2MyContentProvider("webabcd"); 
            } 
        }); 
 
        Button btn6 = (Button) this.findViewById(R.id.btn6); 
        btn6.setText("获取记录从 MyContentProvider"); 
        btn6.setOnClickListener(new Button.OnClickListener() { 
            public void onClick(View v) { 
                displayRecord2MyContentProvider(); 
            } 
        }); 
    } 
 
    // 调用 ContentProvider 的插入接口 
    private void insertRecords(String name, String phoneNum) { 
        ContentValues values = new ContentValues(); 
        values.put(People.NAME, name); 
        Uri uri = getContentResolver().insert(People.CONTENT_URI, values); 
        Log.d("MyDebug", uri.toString()); 
        Uri numberUri = Uri.withAppendedPath(uri, 
                People.Phones.CONTENT_DIRECTORY); 
        Log.d("MyDebug", numberUri.toString()); 
 
        values.clear(); 
        values.put(Contacts.Phones.TYPE, People.Phones.TYPE_MOBILE); 
        values.put(People.NUMBER, phoneNum); 
        getContentResolver().insert(numberUri, values); 
    } 
 
    // 调用 ContentProvider 的查询接口 
    private void displayRecords() { 
        String[] columns = new String[] { People._ID, People.NAME, 
                People.NUMBER }; 
        Uri contacts = People.CONTENT_URI; 
        Log.d("MyDebug", contacts.toString()); 
        Cursor cur = managedQuery(contacts, columns, // 要返回的数据字段 
                null, // WHERE子句 
                null, // WHERE 子句的参数 
                null // Order-by子句 
        ); 
 
        if (cur.moveToFirst()) { 
            String id = null; 
            String name = null; 
            String phoneNo = null; 
            while (cur.getPosition() != cur.getCount()) { 
                id = cur.getString(cur.getColumnIndex(People._ID)); 
                name = cur.getString(cur.getColumnIndex(People.NAME)); 
                phoneNo = cur.getString(cur.getColumnIndex(People.NUMBER)); 
 
                Toast.makeText(this, id + " / " + name + " / " + phoneNo, 
                        Toast.LENGTH_SHORT).show(); 
                cur.moveToNext(); 
            } 
        } 
    } 
 
    // 调用 ContentProvider 的删除接口 
    private void deleteRecords() { 
        Uri uri = People.CONTENT_URI; 
        Log.d("MyDebug", uri.toString()); 
        getContentResolver().delete(uri, null, null); 
        // getContentResolver().delete(uri, "NAME=" + "'name'", null); 
    } 
 
    // 调用 ContentProvider 的更新接口 
    private void updateRecord(int recordNo, String name) { 
        Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, recordNo); 
        Log.d("MyDebug", uri.toString()); 
        ContentValues values = new ContentValues(); 
        values.put(People.NAME, name); 
        getContentResolver().update(uri, values, null, null); 
    } 
 
     
    // 调用自定义 ContentProvider 的插入接口 
    private void insertRecord2MyContentProvider(String name) { 
        ContentValues values = new ContentValues(); 
        values.put(MyUser.User.USER_NAME, name); 
        getContentResolver().insert(MyUser.User.CONTENT_URI, values); 
 
    } 
 
    // 调用自定义 ContentProvider 的查询接口 
    private void displayRecord2MyContentProvider() { 
        String[] columns = new String[] { MyUser.User.USER_NAME }; 
        Uri uri = MyUser.User.CONTENT_URI; 
        Cursor cur = managedQuery(uri, columns, null, null, null); 
 
        while (cur.getPosition() != cur.getCount()) { 
            String id = cur.getString(cur.getColumnIndex(People._ID)); 
            String name = cur.getString(cur.getColumnIndex(MyUser.User.USER_NAME)); 
            Toast.makeText(this, 
                    id + " / " + name, 
                    Toast.LENGTH_SHORT).show(); 
            cur.moveToNext(); 
        } 
    } 

 
AndroidManifest.xml 
 
代码  
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.webabcd.contentprovider" 
      android:versionCode="1" 
      android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
        <activity android:name=".Main" 
                  android:label="@string/app_name"> 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
         
        <!-- 
            配置一个自定义的 ContentProvider" 
        --> 
        <provider android:name="MyContentProvider" android:authorities="com.webabcd.MyContentProvider" /> 
    </application> 
    <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission> 
    <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission> 
    <uses-sdk android:minSdkVersion="3" /> 
</manifest>  
分享到:
评论

相关推荐

    android sqlite操作 demo

    本`android sqlite操作 demo`提供了关于如何在Android应用中使用SQLite进行数据操作的示例。 SQLite在Android中的使用通常包括以下几个步骤: 1. **创建数据库**: 首先,我们需要创建一个SQLite数据库。这通常是...

    Android Sqlite操作类(原创)

    现用项目中Sqlite操作类, 1.数据库初始化 2.数据库版本升级 3.从表中查询数据,并返回ArrayList,简单操作不需要建类 4.单一行查询返回、int 返回、string查询返回

    mono for android sqlite操作示例源代码

    mono for android sqlite操作示例源代码、 包括 sqliteconnection 获取 地址设置 commond 链接,操作 完成了 数据库文件创建,数据库表创建, 内容添加等 没做提示窗口, 请用 Android device logging 查找标签:...

    android sqlite操作源码(含滑动分页)

    本项目"android sqlite操作源码(含滑动分页)"旨在提供一套完整的SQLite数据库操作示例,涵盖了基本的增删改查功能,并且结合了滑动分页技术,这对于处理大量数据的Android应用来说是必不可少的。 首先,我们需要...

    android sqlite操作

    总的来说,Android的SQLite操作涵盖了数据库的创建、使用、事务管理、优化等多个方面,熟练掌握这些知识点对于开发高效、可靠的Android应用程序至关重要。通过实践和不断学习,开发者可以更好地利用SQLite为用户提供...

    android SQLite 操作数据库

    本文将深入探讨如何在Android环境中进行SQLite数据库的操作。 首先,我们需要创建一个SQLite数据库。在Android中,通常通过继承`SQLiteOpenHelper`类来实现。这个类提供了创建、升级和打开数据库的方法。你需要重写...

    Android SQLite学习工具

    这篇博客“Android SQLite学习工具”可能详细介绍了如何在Android环境中使用SQLite进行数据操作,并提供了一个实用的SQLite管理工具——sqlite3.exe。 SQLite数据库在Android中的应用主要包括创建数据库、创建表、...

    android Sqlite基本操作

    为了提高性能和用户体验,可以使用异步任务或Android的`AsyncTask`来处理SQLite操作,避免阻塞主线程。 六、数据库升级 当需要更改数据库结构(如添加、删除或修改表)时,需要增加`DATABASE_VERSION`并实现`...

    android sqlite可视化工具

    为了更方便地管理和操作SQLite数据库,开发者通常会借助一些可视化工具,例如“android sqlite可视化工具”。这类工具提供了图形化的界面,使得数据库的创建、查询、修改和管理变得更加直观和便捷。 “android ...

    Android SQLite数据库操作Demo

    在这个"Android SQLite数据库操作Demo"中,我们将探讨如何在Android应用中创建、查询、更新和删除SQLite数据库的数据。 1. **数据库初始化** 在Android中,我们通常通过扩展SQLiteOpenHelper类来初始化SQLite...

    android Sqlite数据库操作demo

    在这个"android Sqlite数据库操作demo"中,我们可以深入理解如何在Android应用中进行SQLite的增删改查操作。 首先,我们需要在Android项目中创建一个SQLite数据库。这通常通过继承SQLiteOpenHelper类来实现。...

    Android SQLite 增、删、查、改操作源码

    在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的数据库系统...在提供的压缩包文件中,应该包含了这些操作的完整源码,你可以通过学习和理解这些代码来进一步提升你在Android SQLite操作上的能力。

    Android SQLite的基本操作Demo

    本教程将详细介绍Android SQLite的基本操作,包括创建数据库、创建表、插入数据、查询数据、更新数据和删除数据。 首先,我们需要在Android应用中创建一个SQLiteOpenHelper的子类,这个类是管理SQLite数据库生命...

    Android实验报告Sqlite数据库操作.pdf

    Android SQLite 数据库操作报告 一、实验目的 Android 实验报告的主要目的是熟悉 Android 平台的文件操作、掌握 Android SQLite 数据库的设计和应用、熟悉 XML 和 JSON 文件的读取。通过本实验,用户可以掌握 ...

    Android数据库SQLite详解

    Android中的SQLite操作 - **SQLiteOpenHelper**: 这是Android提供的一个抽象类,用于创建、升级和打开数据库。你需要继承这个类并实现其中的`onCreate()`和`onUpgrade()`方法。 - **onCreate()**: 当数据库首次...

    android sqlite常用操作语句

    android中 sqlite数据库操作中常用的SQL 语句,留下备用,防止出错

    sqlite-android,android sqlite支持库.zip

    SQLite 是一个轻量级的关系型数据库管理系统,广泛应用于移动设备,尤其..."sqlite-android,android sqlite支持库.zip" 提供了针对 Android 平台的 SQLite 最新实现,可以帮助开发者更高效地管理和操作应用程序的数据。

    Android SQLite可视化操作工具

    总之,“Android SQLite可视化操作工具”为Android开发者提供了高效的数据管理手段,减少了与SQLite数据库交互时的复杂性,提高了开发效率。通过熟练掌握这类工具,开发者可以更好地管理和优化应用程序的数据库部分...

    Android SQLite数据库操作demo

    本篇将基于一个名为"Android SQLite数据库操作demo"的示例项目,探讨如何在Android中进行SQLite数据库的相关操作。原作者的博客地址为http://blog.csdn.net/liuhe688/article/details/6715983。 首先,我们来看一下...

    Android SQLite源码+说明

    在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的数据库系统,允许开发者在移动设备上存储和管理数据。本资料包包含了对Android SQLite的详细文档和源码分析,帮助开发者深入理解其工作原理。 ...

Global site tag (gtag.js) - Google Analytics