iOSのステップアップ-SQLiteデータベース
9309 ワード
一、データベース管理システム
SQL言語概念SQLは構造化されたクエリー言語であり、TAはデータベースのために作成された操作コマンドセットであり、機能が整ったデータベース言語である.一般的なデータベース言語:MySQL、Oracle データベース管理システム
データベースの特徴:は、一定の方法で一緒に記憶する .は、複数のユーザに対して を共有することができる.は、できるだけ少ない冗長コード を有する.とプログラムが互いに独立するデータセット こんなに多くのデータベースに関する知識を話しているのに、いったい何がデータベースなのか.データベース(Database)は、データ構造に従ってデータを整理、格納、管理する倉庫 である.
データベースの分類リレーショナル・データベース(主流)、オブジェクト・データベース、階層データベース
共通リレーショナル・データベースPC側:Oracle、MySQL、SQL Server、Access、DB 2、Sybase埋め込み/モバイル・クライアント:SQLite
SQLiteは軽量レベルのリレーショナル・データベースです.SQLiteの当初の設計目標は組み込みシステムであり、TAの占有資源は非常に少なく、組み込み機器では数百Kのメモリだけで十分であり、現在はAndroid、iOS、Windows Phoneなどのスマートフォンに応用されている.iOS使用時のSQLiteは、libsqlite 3を追加するだけです.0.tbd依存およびsqlite 3の導入.hヘッダファイルでOK
データベースにはいくつかの重要な概念があります
表:データベース内の非常に重要なオブジェクトであり、他のオブジェクトの基礎です.情報の分類状況に応じて、1つのデータベースに複数のデータテーブルが含まれる場合があります.
≪フィールド|Fields|oem_src≫:表の列は「≪フィールド|Fields|oem_src≫」と呼ばれ、各フィールドには特定のトピックの情報が含まれます.
レコード:データ・テーブルの1行の情報に対応する完全な関連情報のセットです.
SQLの重要な点は、SQLが大文字と小文字に敏感ではないことを覚えておいてください.
SQL文の後のセミコロン
データベースシステムでセミコロンは各SQL文を区切る標準的な方法であり、サーバに対する同じ要求で1つ以上の文を実行することができます.注意しなければならないのは、一部のデータベースでは各SQLコマンドSQLの末尾にセミコロンを付ける必要がありますが、SQLiteは別のクラスに属し、TAの文の末尾にセミコロンは使用されません. PS:Objective-Cを学習するとき、各文の末尾にセミコロンを付ける必要がありますが、SQLiteは を区別する必要はありません.
SQLiteデータベースのデータ型SQLiteはタイプのないデータベースであり、任意のタイプのデータを保存することができ、SQLiteにとってフィールドにタイプを指定しないのはSQLiteと他のデータベースとの互換性を最大化するために完全に有効であり、SQLiteは「タイプ近似」の観点をサポートし、列のタイプ近似は列上のデータを格納する推奨タイプを指す.
SQLite近似型規則タイプ文字列に「int」が含まれている場合、このフィールドの親縁タイプはINTEGER である.タイプ文字列に「char」、「clob」または「text」が含まれている場合、このフィールドの親縁タイプは、VARCHR のようなTEXTであるタイプ文字列に「blob」が含まれている場合、このフィールドの親縁タイプはnone です.タイプ文字列に「real」、「floa」または「doub」が含まれている場合、このフィールドの親縁タイプはreal です.残りの場合、フィールドの親縁タイプはNUMERIC である.
SQLiteフィールド制約 not null-非空 unique-ユニーク primary key-プライマリ・キー foreign key-外部キー check-条件チェックは、1列のすべての値が一定の条件 を満たすことを保証する. default-デフォルト autoincreatement-自己増加変数 SQL文 SQLの文は、データ操作言語(DML)とデータ定義言語(DDL) の2つの部分に分けられます.
クエリと更新命令はSQLのDML部分を構成します.データ挿入コマンド-insert データベース更新コマンド-update データベース削除コマンド-delete データベース検索コマンド-select DDLセクションでは、アクティブな削除テーブルを作成できます.インデックスを定義したり、テーブル間のリンクを指定したり、テーブル間の制約を適用したりすることもできます.データベース作成コマンド-create database データベースコマンドの変更-alter database 新しいテーブルを作成するコマンド-create table データベース内のテーブルを変更する——alter table 削除テーブル——drop table インデックスの作成-create index インデックスの削除-drop index 三、iOSのデータベース技術の実現
SQLiteの使用を開始するために必要ないくつかのステップ
必要なフレームワーク:libsqlite 3.0.tbdヘッダファイル を導入データベースを開く SQLコマンドを実行する——表を作成して、添削して調べるなどの操作 データベースを閉じる データベースのオン/オフ私たちのiOSプログラムでは、一般的には1つのデータベースしかありません.私たちはデータベースに複数のテーブルを作成して異なる情報を保存することができますが、複数のデータベースを作成しないでください.各データベースには1つのテーブルしかありません.接続が絶えないため、データベースを閉じるのはパフォーマンスのかかる です.
データベース操作用のDBクラスの作成
データベースを開く
データベースを閉じる
学生クラスを作成
テーブルの作成方法
テーブル内のすべての学生を取得
対応IDの学生を検索
テーブルにレコードを追加
レコードの更新
レコードの削除
SQL言語概念SQLは構造化されたクエリー言語であり、TAはデータベースのために作成された操作コマンドセットであり、機能が整ったデータベース言語である.
データベースの特徴:
データベースの分類リレーショナル・データベース(主流)、オブジェクト・データベース、階層データベース
共通リレーショナル・データベースPC側:Oracle、MySQL、SQL Server、Access、DB 2、Sybase埋め込み/モバイル・クライアント:SQLite
SQLiteは軽量レベルのリレーショナル・データベースです.SQLiteの当初の設計目標は組み込みシステムであり、TAの占有資源は非常に少なく、組み込み機器では数百Kのメモリだけで十分であり、現在はAndroid、iOS、Windows Phoneなどのスマートフォンに応用されている.iOS使用時のSQLiteは、libsqlite 3を追加するだけです.0.tbd依存およびsqlite 3の導入.hヘッダファイルでOK
データベースにはいくつかの重要な概念があります
表:データベース内の非常に重要なオブジェクトであり、他のオブジェクトの基礎です.情報の分類状況に応じて、1つのデータベースに複数のデータテーブルが含まれる場合があります.
≪フィールド|Fields|oem_src≫:表の列は「≪フィールド|Fields|oem_src≫」と呼ばれ、各フィールドには特定のトピックの情報が含まれます.
レコード:データ・テーブルの1行の情報に対応する完全な関連情報のセットです.
SQLの重要な点は、SQLが大文字と小文字に敏感ではないことを覚えておいてください.
SQL文の後のセミコロン
データベースシステムでセミコロンは各SQL文を区切る標準的な方法であり、サーバに対する同じ要求で1つ以上の文を実行することができます.注意しなければならないのは、一部のデータベースでは各SQLコマンドSQLの末尾にセミコロンを付ける必要がありますが、SQLiteは別のクラスに属し、TAの文の末尾にセミコロンは使用されません.
SQLiteデータベースのデータ型SQLiteはタイプのないデータベースであり、任意のタイプのデータを保存することができ、SQLiteにとってフィールドにタイプを指定しないのはSQLiteと他のデータベースとの互換性を最大化するために完全に有効であり、SQLiteは「タイプ近似」の観点をサポートし、列のタイプ近似は列上のデータを格納する推奨タイプを指す.
SQLite近似型規則
SQLiteフィールド制約
クエリと更新命令はSQLのDML部分を構成します.
SQLiteの使用を開始するために必要ないくつかのステップ
必要なフレームワーク:libsqlite 3.0.tbd
データベース操作用のDBクラスの作成
データベースを開く
#import "DB.h"
@implementation DB
//
static sqlite3 *db = nil;
//
+ (sqlite3 *)open {
//
//
// SQLite API( ) , ,
//
if (db != nil) {
return db;
}
// Documents
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
//
NSString *sqlPath = [docPath stringByAppendingPathComponent:@"studentDB.sqlite"];
//
NSFileManager *fileManager = [NSFileManager defaultManager];
// , ,
if ([fileManager fileExistsAtPath:sqlPath] == NO) {
//
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"studentDB" ofType:@"sqlite"];
//
//
//
[fileManager copyItemAtPath:filePath toPath:sqlPath error:nil];
}
//
// ( C , NSString )
//
sqlite3_open([sqlPath UTF8String], &db);
return db;
}
データベースを閉じる
//
+ (void)close {
//
sqlite3_close(db);
//
db = nil;
}
学生クラスを作成
テーブルの作成方法
//
- (void)createTable {
// sql NSString
NSString *sql = @"create table if not exists stu (ID integer primary key, name text not null, gender text default ' ')";
//
sqlite3 *db = [DB open];
// sql
int result = sqlite3_exec(db, sql.UTF8String, nil, nil, nil);
if (result == SQLITE_OK) {
NSLog(@" ");
} else {
NSLog(@" ");
}
//
[DB close];
}
テーブル内のすべての学生を取得
//
+ (NSArray *)allStudents {
//
sqlite3 *db = [DB open];
//
sqlite3_stmt *stmt = nil;
//
NSMutableArray *mArr = nil;
// , sql , , , sql ,sql
int result = sqlite3_prepare_v2(db, "select * from Students", -1, &stmt, nil);
if (result == SQLITE_OK) {
//
mArr = [NSMutableArray arrayWithCapacity:0];
// SQLite_ROW ,sqlite3_step() SQLite_ROW, , , , sqlite3_step(), SQLite_DONE,
while (sqlite3_step(stmt) == SQLITE_ROW) {
//
// , , 0
int ID = sqlite3_column_int(stmt, 0);
const unsigned char *cName = sqlite3_column_text(stmt, 1);
const unsigned char *cGender = sqlite3_column_text(stmt, 2);
// C OC
NSString *name = [NSString stringWithUTF8String:(const char *)cName];
NSString *gender = [NSString stringWithUTF8String:(const char *)cGender];
Student *student = [Student studentWithID:ID name:name gender:gender];
//
[mArr addObject:student];
}
}
//
sqlite3_finalize(stmt);
return mArr;
}
対応IDの学生を検索
// ID,
+ (Student *)findStudentByID:(int)ID {
//
sqlite3 *db = [DB open];
//
sqlite3_stmt *stmt = nil;
Student *student = nil;
//
int result = sqlite3_prepare_v2(db, "select * from Students where ID = ?", -1, &stmt, nil);
if (result == SQLITE_OK) {
// sql , ,sql ? , ,
// 1 sql , 1
sqlite3_bind_int(stmt, 1, ID);
if (sqlite3_step(stmt) == SQLITE_ROW) {
//
const unsigned char *cName = sqlite3_column_text(stmt, 1);
const unsigned char *cGender = sqlite3_column_text(stmt, 2);
// C OC
NSString *name = [NSString stringWithUTF8String:(const char *)cName];
NSString *gender = [NSString stringWithUTF8String:(const char *)cGender];
student = [Student studentWithID:ID name:name gender:gender];
}
}
//
sqlite3_finalize(stmt);
return student;
}
テーブルにレコードを追加
//
+ (void)insertStudentWithID:(int)ID name:(NSString *)name gender:(NSString *)gender {
//
sqlite3 *db = [DB open];
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare_v2(db, "insert into Students values(?,?,?)", -1, &stmt, nil);
if (result == SQLITE_OK) {
//
sqlite3_bind_int(stmt, 1, ID);
sqlite3_bind_text(stmt, 2, [name UTF8String], -1, nil);
sqlite3_bind_text(stmt, 3, [gender UTF8String], -1, nil);
// ,
sqlite3_step(stmt);
}
//
sqlite3_finalize(stmt);
}
レコードの更新
// ID
+ (void)updateStudentName:(NSString *)name gender:(NSString *)gender forID:(int)ID {
//
sqlite3 *db = [DB open];
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare_v2(db, "update Student set name = ?, gender = ? where ID = ?", -1, &stmt, nil);
if (result == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
sqlite3_bind_text(stmt, 2, [gender UTF8String], -1, nil);
sqlite3_bind_int(stmt, 3, ID);
sqlite3_step(stmt);
}
sqlite3_finalize(stmt);
}
レコードの削除
// ID
+ (void)deleteStudentByID:(int)ID {
//
sqlite3 *db = [DB open];
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare_v2(db, "delete from Students where ID = ?", -1, &stmt, nil);
if (result == SQLITE_OK) {
sqlite3_bind_int(stmt, 1, ID);
sqlite3_step(stmt);
}
sqlite3_finalize(stmt);
}