13.3 使用SQLite.NET-PCL访问SQLite数据库

分类:C#、Android、VS2015;

创建日期:2016-02-26

一、简介

本章开头已经说过了,SQLite.NET-PCL用起来很爽,这一节咱们看看怎样使用吧。

二、示例3运行截图

下面左图是单击【初始化表数据】后的结果,右图是单击【获取所有记录】后的结果。

  

下面左图是单击【添加新行】后的界面,右图是添加后重新获取的所有记录:

  

修改、删除、查找不再截图了,有兴趣自己玩吧。

三、主要设计步骤

1、添加SQLite.NET-PCL程序包

通过NuGet直接添加即可。

2、创建数据库和表

为了让项目结构看起来更直观,可单独建立一个文件夹(不是必须这样做,仅仅是为了一眼就能看出这个数据库中有哪些表)。比如,在SrcDemos文件夹下添加一个MyDb3Models文件夹,该文件夹用于保存与“MyDb3.db”数据库相关的.cs文件。

(1)添加MyDb3.cs文件

在SrcDemos\MyDb3Models文件夹下添加MyDb3.cs文件:

using SQLite.Net;
using SQLite.Net.Platform.XamarinAndroid;
using System;
using System.IO;

namespace MyDemos.SrcDemos.MyDb3Models
{
    public class MyDb3 : SQLiteConnection
    {
        /// <summary>
        /// MyDb3.db的路径
        /// </summary>
        private static string dbPath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.Personal),
            "MyDb3.db");
        public MyDb3() : base(new SQLitePlatformAndroid(), dbPath)
        {
            CreateTable<Student>();
            CreateTable<Course>();
        }
    }
}

作为例子,这个帮助器类仅保存了SQlite数据库的路径,实际上还可以用它进一步封装对数据库表的各种操作。

(2)添加Student.cs文件

在SrcDemos\MyDb3Models文件夹下添加该文件。

using System;
using SQLite.Net.Attributes;

namespace MyDemos.SrcDemos.MyDb3Models
{
    [Table("Student")]
    public class Student
    {
        //主键,自动增量
        [PrimaryKey,AutoIncrement]
        public int id { get; set; }

        //学号
        [Unique, NotNull]
        public string XueHao { get; set; }

        //姓名
        [MaxLength(30), NotNull]
        public string Name { get; set; }

        //年龄
        public int Age { get; set; }

        //出生日期
        public DateTime BirthDate { get; set; }
    }
}

其中,[Table("…")]特性声明指定该类在数据库中的表名。PrimaryKey特性表示Id为主键,AutoIncrement表示自动增量。

下面是常用的一些特性:

[PrimaryKey] :主键,只能用于int类型的属性。

[AutoIncrement] :自动增量。每插入一条新数据该字段都会自增1,只能用于int类型。

[Column(name)] :对应到表中的字段名,如果不添加该特性,则表中的字段名与属性名相同。

[Table(name)] :表示该类对应到数据库中的表名,如果不加该特性,则数据库中的表名可能会使用该类名的复数形式(MyTable1s)。

[MaxLength(value)] :限制字符串的最大长度。

[Ignore] :表示忽略该属性,即:不在表中生成对应的字段。

[Unique] :表中该列的值不重复。

(3)添加Course.cs文件

在SrcDemos\MyDb3Models文件夹下添加该文件。实际没用它,仅仅是为了演示如何添加多个表。当然了,例子不是实际项目,没必要搞那么复杂,玩玩知道怎么用就行了,也没必要非得和实际项目一致。

using SQLite.Net.Attributes;

namespace MyDemos.SrcDemos.MyDb3Models
{
    /// <summary>
    /// 课程成绩表
    /// </summary>
    [Table("Course")]
    public class Course
    {
        //主键,自动增量
        [PrimaryKey,AutoIncrement]
        public int id { get; set; }

        //学号
        public string StudentId { get; set; }

        //课程号
        public string CourseId { get; set; }

        //课程名称
        public string CourseName { get; set; }

        //成绩
        public int ChengJi { get; set; }
    }
}

3、创建布局页面

布局文件都保存在Resoureces/layout文件夹下。

注意:实际的手机应用程序中一般不要有【返回主页】的按钮,因为它实际上并不是返回,而是新建页。这个例子中包含的【返回主页】仅仅是为了让你看看是如何新建的。另外,实际项目中应该用带返回结果的Intent来实现,为了不搞这么麻烦,例子中并没有这样做。

(1)主页--ch1303_Main.axml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:text="初始化表数据"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnCreateDB" />
    <Button
        android:text="获取所有记录"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnGetAll" />
    <Button
        android:text="添加新行"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnInsert" />
    <Button
        android:text="修改行"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnUpdate" />
    <Button
        android:text="删除行"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnDelete" />
    <Button
        android:text="通过学号查找行"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnGetDataById" />
    <TextView
        android:id="@+id/txtResult"
        android:layout_marginTop="20dp"
        android:text="操作结果"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:background="@color/myBlue" />
</LinearLayout>

(2)插入页面--ch1303_InsertLayout.axml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:text="添加新纪录"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="30dp"
        android:layout_gravity="center_horizontal"
        android:id="@+id/textView1" />
  <TextView
      android:text="学号:"
      android:textAppearance="?android:attr/textAppearanceMedium"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:id="@+id/textViewxuehao" />
  <EditText
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:id="@+id/txtNewXueHao" />
  <TextView
        android:text="姓名:"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView2" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtNewName" />
    <TextView
        android:text="年龄:"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView3" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtNewAge" />
    <Button
        android:text="添加"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnAddNewRecord" />
    <Button
        android:text="返回主页"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnReturn" />
</LinearLayout>

(3)查找页面--ch1303_SearchLayout.axml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:text="按学号查找"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="30dp"
        android:layout_gravity="center_horizontal"
        android:id="@+id/textView1" />
    <TextView
        android:text="学号:"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView2" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtId" />
    <Button
        android:text="查找"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnSearch" />
    <Button
        android:text="返回主页"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnReturn" />
</LinearLayout>

(4)更新页面--ch1303_UpdateLayout.axml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:text="修改记录"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="30dp"
        android:layout_gravity="center_horizontal"
        android:id="@+id/textView1" />
    <TextView
        android:text="学号:"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView2" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtUpdateId" />
    <Button
        android:text="查找"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnSearch"
        android:layout_marginBottom="30dp" />
    <TextView
        android:text="姓名"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView3" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtUpdateName" />
    <TextView
        android:text="年龄"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView4" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtUpdateAge" />
    <Button
        android:text="更新"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnUpdate" />
    <Button
        android:text="返回主页"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnReturn" />
</LinearLayout>

(5)删除页面--ch1303_RemoveLayout.axml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:text="删除记录"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="30dp"
        android:layout_gravity="center_horizontal"
        android:id="@+id/textView1" />
    <TextView
        android:text="学号:"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView2" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtTaskID" />
    <Button
        android:text="删除"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnDelete" />
    <Button
        android:text="返回主页"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnReturn" />
</LinearLayout>

4、创建Activity

下面的代码将获取数据库的路径并打开该数据库:

using(db = new SQLiteConnection(MyDbHelp.dbPath))

{

……

}

成功打开该数据库之后,剩下的工作只需要利用db就可以轻松完成了。

注意:使用using语句的好处是可确保操作完成后立即关闭数据库连接。

如果不这样做,用SQLiteConnection打开数据库连接后,必须显式调用Close()方法来关闭数据库连接。但是,由于编程人员在项目周期紧张的情况下为了完成任务经常顾头不顾屁股(打开连接操作后常常忘记关闭连接,特别是初学者更是如此),从而导致内存占用越来越多(即所谓的内存泄露),用using语句来实现,可确保不会出现这种情况。

实际上,不管你采用哪种方式操作数据库(包括用内置的API实现),都不要忘了打开数据库连接后,不用时必须立即关闭连接这种要求,否则你就是自己给自己制造了一系列“拌子”说不定啥时候就崴了自己的脚。

(1)插入--ch1303InsertActivity.cs文件

using System;
using Android.App;
using Android.OS;
using Android.Widget;
using MyDemos.SrcDemos.MyDb3Models;

namespace MyDemos.SrcDemos
{
    [Activity(Label = "【例13-3】SQLite基本用法3")]
    public class ch1303InsertActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ch1303_InsertLayout);
            var txtXueHao = FindViewById<EditText>(Resource.Id.txtNewXueHao);
            var txtName = FindViewById<EditText>(Resource.Id.txtNewName);
            var txtAge = FindViewById<EditText>(Resource.Id.txtNewAge);
            Button btnAdd = FindViewById<Button>(Resource.Id.btnAddNewRecord);
            btnAdd.Click += delegate
            {

                string s = "添加成功!";
                try
                {
                    using (MyDb3 db = new MyDb3())
                    {
                        db.Insert(new Student()
                        {
                            XueHao = txtXueHao.Text,
                            Name = txtName.Text,
                            Age = int.Parse(txtAge.Text),
                            BirthDate = new DateTime(1990, 1, 1)
                        });
                    }
                }
                catch (Exception ex)
                {
                    s = "添加失败:" + ex.Message;
                }
                Toast.MakeText(this, s, ToastLength.Short).Show();
            };

            FindViewById<Button>(Resource.Id.btnReturn).Click += delegate
            {
                StartActivity(typeof(ch1303MainActivity));
            };
        }
    }
}

(2)删除--ch1303RemoveActivity.cs文件

using Android.App;
using Android.OS;
using Android.Widget;
using MyDemos.SrcDemos.MyDb3Models;

namespace MyDemos.SrcDemos
{
    [Activity(Label = "【例13-3】SQLite基本用法3")]
    public class ch1303RemoveActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ch1303_RemoveLayout);

            EditText txtId = FindViewById<EditText>(Resource.Id.txtTaskID);

            Button btnRemove = FindViewById<Button>(Resource.Id.btnDelete);
            btnRemove.Click += delegate
            {
                using (MyDb3 db = new MyDb3())
                {
                    var q = db.Table<Student>().Where(t => t.XueHao == txtId.Text);
                    int n = q.Count();
                    foreach (var v in q)
                    {
                        db.Delete<Student>(v.id);
                    }
                    Toast.MakeText(this,
                        string.Format("删除了 {0} 条记录。", n),
                        ToastLength.Short).Show();
                }
            };

            FindViewById<Button>(Resource.Id.btnReturn).Click += delegate
            {
                StartActivity(typeof(ch1303MainActivity));
            };
        }
    }
}

(3)查找--ch1303SearchActivity.cs文件

using Android.App;
using Android.OS;
using Android.Widget;
using MyDemos.SrcDemos.MyDb3Models;

namespace MyDemos.SrcDemos
{
    [Activity(Label = "【例13-3】SQLite基本用法3")]
    public class ch1303SearchActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ch1303_SearchLayout);

            Button btnSearch = FindViewById<Button>(Resource.Id.btnSearch);
            btnSearch.Click += delegate
            {
                EditText txtId = FindViewById<EditText>(Resource.Id.txtId);
                using (MyDb3 db = new MyDb3())
                {
                    var q = db.Table<Student>().Where(x => x.XueHao == txtId.Text);
                    string s = "未找到学号:" + txtId.Text;
                    if (q.Count() > 0)
                    {
                        Student v = q.First();
                        s = string.Format("{0} \t{1} \t{2} \t{3:yyyy-MM-dd}",
                            v.XueHao, v.Name, v.Age, v.BirthDate);
                    }
                    Toast.MakeText(this, s, ToastLength.Short).Show();
                }
            };

            FindViewById<Button>(Resource.Id.btnReturn).Click += delegate
            {
                StartActivity(typeof(ch1303MainActivity));
            };
        }
    }
}

(4)更新--ch1303UpdateActivity.cs文件

using Android.App;
using Android.OS;
using Android.Widget;
using MyDemos.SrcDemos.MyDb3Models;

namespace MyDemos.SrcDemos
{
    [Activity(Label = "【例13-3】SQLite基本用法3")]
    public class ch1303UpdateActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ch1303_UpdateLayout);

            EditText txtId = FindViewById<EditText>(Resource.Id.txtUpdateId);
            EditText txtName = FindViewById<EditText>(Resource.Id.txtUpdateName);
            EditText txtAge = FindViewById<EditText>(Resource.Id.txtUpdateAge);

            Button btnSearch = FindViewById<Button>(Resource.Id.btnSearch);
            btnSearch.Click += delegate
            {
                using (MyDb3 db = new MyDb3())
                {
                    Student student = db.Table<Student>().Where(x => x.XueHao == txtId.Text).FirstOrDefault();
                    txtName.Text = student.Name;
                    txtAge.Text = student.Age.ToString();
                }
            };

            Button btnUpdate = FindViewById<Button>(Resource.Id.btnUpdate);
            btnUpdate.Click += delegate
            {
                string s = "未找到:" + txtId.Text;
                using (MyDb3 db = new MyDb3())
                {
                    var q = db.Table<Student>().Where(x => x.XueHao == txtId.Text);
                    if (q.Count() > 0)
                    {
                        Student student = q.First();
                        student.Name = txtName.Text;
                        student.Age = int.Parse(txtAge.Text);
                        db.Update(student);
                        s = "修改成功!";
                    }
                }
                Toast.MakeText(this, s, ToastLength.Short).Show();
            };

            FindViewById<Button>(Resource.Id.btnReturn).Click += delegate
            {
                StartActivity(typeof(ch1303MainActivity));
            };
        }
    }
}

(5)主页--ch1303MainActivity.cs文件

using System;
using Android.App;
using Android.OS;
using Android.Widget;
using MyDemos.SrcDemos.MyDb3Models;

namespace MyDemos.SrcDemos
{
    [Activity(Label = "【例13-3】SQLite基本用法3")]
    public class ch1303MainActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ch1303_Main);

            var txtResult = FindViewById<TextView>(Resource.Id.txtResult);
            FindViewById<Button>(Resource.Id.btnCreateDB).Click += delegate
            {
                try
                {
                    using (var db = new MyDb3())
                    {
                        db.DeleteAll<Student>();
                        db.Insert(new Student() { XueHao = "01001", Name = "张三", Age = 20, BirthDate = new DateTime(1990, 1, 1) });
                        db.Insert(new Student() { XueHao = "01002", Name = "李四", Age = 22, BirthDate = new DateTime(1992, 6, 15) });
                        db.Insert(new Student() { XueHao = "01003", Name = "王五", Age = 21, BirthDate = new DateTime(1993, 12, 8) });

                        db.DeleteAll<Course>();
                        db.Insert(new Course() { StudentId = "01001", CourseId = "001", CourseName = "课程1", ChengJi = 90 });
                        db.Insert(new Course() { StudentId = "01002", CourseId = "001", CourseName = "课程1", ChengJi = 92 });
                        db.Insert(new Course() { StudentId = "01003", CourseId = "001", CourseName = "课程1", ChengJi = 96 });

                        txtResult.Text = "初始化完毕!数据库位置:\n" + db.DatabasePath;
                    }
                }
                catch (Exception ex)
                {
                    txtResult.Text = "初始化失败:\n" + ex.Message;
                }
            };

            FindViewById<Button>(Resource.Id.btnGetAll).Click += delegate
            {
                using (var db = new MyDb3())
                {
                    var q = db.Table<Student>();

                    //用法1
                    //string s = string.Format("Student共有 {0} 条记录:\n", q.Count());
                    //用法2(C# 6.0提供的增强功能,仅适用于VS2015)
                    string s = $"Student共有 {q.Count()} 条记录:\n";

                    foreach (var v in q)
                    {
                        s += $"{v.XueHao,10} \t{v.Name,10} \t{v.Age,-10} \t{v.BirthDate:yyyy-MM-dd}\n";
                    }
                    txtResult.Text = s;
                }
            };

            FindViewById<Button>(Resource.Id.btnInsert).Click += delegate
            {
                StartActivity(typeof(ch1303InsertActivity));
            };

            FindViewById<Button>(Resource.Id.btnGetDataById).Click += delegate
            {
                StartActivity(typeof(ch1303SearchActivity));
            };

            var btnUpdate = FindViewById<Button>(Resource.Id.btnUpdate);
            btnUpdate.Click += delegate
            {
                StartActivity(typeof(ch1303UpdateActivity));
            };

            var btnDelete = FindViewById<Button>(Resource.Id.btnDelete);
            btnDelete.Click += delegate
            {
                StartActivity(typeof(ch1303RemoveActivity));
            };
        }
    }
}
时间: 2024-10-16 14:20:23

13.3 使用SQLite.NET-PCL访问SQLite数据库的相关文章

13.4 使用SQLite.NET.Async-PCL访问SQLite数据库

分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 这一节演示如何利用以异步方式(async.await)访问SQLite数据库. 二.示例4运行截图 下面左图为初始页面,右图为单击[创建数据库]按钮后的结果.   下面左图为单击[添加单行]按钮的结果,右图为单击[添加多行]按钮的结果.   注意:不想再像上一节的例子那样逐个添加页面了,毕竟例子的目的仅仅是为了演示最基本的异步操作用法,代码太多容易冲淡要关注的内容,所以该例子并没有去解决重复添加相同学号的记录引

【Android】13.0 第13章 创建和访问SQLite数据库&mdash;本章示例主界面

分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 Android 内置了三种数据存取方式:SQLite数据库.文件.SharedPreferences. 这一章我们主要学习如何使用SQLite数据库存取数据. 1.SQLite是个什么档次的数据库 SQLite是一种免费的.开源的数据库,由于它独特的设计(把各种数据类型都转换为它自己内部处理的5种类型)导致其占用内存极少,因此很多项目都喜欢使用它. Android集成了SQLite并内置了专门对SQLite操作

SQLitedatabase实现访问sqlite

通过SQLiteDatabase 来访问sqlite数据库 ----Main.java public class Main extends Activity { SQLiteDatabase db; ListView listView; EditText editText1, editText2;  //要添加的标题和context Button button; @Override protected void onCreate(Bundle savedInstanceState) { supe

Objective-C访问SQLite

数据库的相关知识我就不去说明了,毕竟只要会sql语言的人就大家都一样. 本案例是在Xcode7.2环境下创建的single view application进行演示操作. 首先第一点,为什么要使用sqlite3? 在iOS的编程中,毫无疑问接触最多的就是界面的代码编排和设计,数据的解析与放置,算法的各种挠头问题... 在数据的解析与放置这一块,就会涉及到数据库缓存的操作,我们都知道,iOS手机编程是在手机端运行的,你不能老是去服务器端读取数据啊,好,就算你不烦,手机也跑的起来,流量不要过啊,对于

应用EF访问SQLite数据

1.创建项目 项目结构初始结构如下图所示,Netage.Data.SQLite 类库项目用于定义访问数据的接口和方法,Netage.SQLiteTest.UI 控制台项目引用 Netage.Data.SQLite 类库,调用其相应的方法来访问数据. 2.在项目中加入SQLite类库 右键 Netage.Data.SQLite 项目,选择"Manage Nuget Packages"菜单,在输入框中输入"System.Data.SQLite",查询到"Sys

android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error(Sqlite code 14): Could not open database,(OS error - 13:Permission denied)

07-24 15:03:14.490 6291-6291/com.tongyan.nanjing.subway E/SQLiteDatabase: Failed to open database '/storage/emulated/0/TYSubway/structure/db/TYSubwayInspcetionNJ.db'. android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error(Sqlite code

SQLite之C#连接SQLite

SQLite是一个开源.免费的小型的Embeddable RDBMS(关系型数据库),用C实现,内存占用较小,支持绝大数的SQL92标准,现在已变得越来越流行,它的体积很小,被广泛应用于各种不同类型的应用中.SQLite已经是世界上布署得最广泛的SQL数据库引擎,被用在无以计数的桌面电脑应用中,还有消费电子设备中,如移动电话.掌上电脑和MP3播放器等. SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它 占用

SQLite 一款轻型的数据库

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口,同样比起Mysql.PostgreSQL这两款开源的世界著名数据库

功能齐全、效率一流的免费开源数据库导入导出工具(c#开发,支持SQL server、SQLite、ACCESS三种数据库),每月借此处理数据5G以上

软件名:DataPie 功能:支持SQL server.SQLite.ACCESS数据库的导入.导出.存储过程调用,支持EXCEL2007.EXCEL2003.ACCESS2007. CSV文件导入数据库,支持EXCEL.CSV.ZIP.ACCESS文件方式导出,支持数据拆分导出及自定义SQL查询与导出. 开发背景:作者从事财务管理工作,主要是出具集团的内部财务报表,随着公司精细化管理的需求,管理报表的数据量急速增长, 依赖EXCEL加工处理数据已经变得极为困难,因此团队全面转向关系数据库进行数

【玩转SQLite系列】(六)SQLite数据库应用案例实现历史搜索记录

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53366564 本文出自[DylanAndroid的博客] [玩转SQLite系列]文章目录 [玩转SQLite系列](一)初识SQLite,重拾sql语句 [玩转SQLite系列](二)SQLite创建和打开数据库的三种方式 [玩转SQLite系列](三)通过sql语句操作SQLite数据库 [玩转SQLite系列](四)通过Android提供的API操作SQLite数据库