SQLite


【Xcode】Supporting Files内のファイルをdocumentsディレクトリにコピーする

Supporting Files内のファイルをdocumentsディレクトリにコピーしたときのスクリプト。
初回起動時に実行したかったので、スクリプトは、AppDelegate.m 内の didFinishLaunchingWithOptions: に記述した。

--------------------------------------------------------------------
//didFinishLaunchingWithOptions は、アプリ起動時に呼び出される。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

//呼び出したいメソッドで下記を実行

NSError *error;

//NSFileManagerクラスは、Foundation フレームワーク(Cocoa Touchフレームワーク)にあるクラス。
//Objective-C で、パスの存在を調べたり、ディレクトリを作成したりするのに使う。

NSFileManager *fm = [NSFileManager defaultManager];

//documentsディレクトリのパス

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"コピーしたいファイル.jpg"];
NSLog(@"writableDBPath;%@",writableDBPath);


/*
//常に新しいDBファイルにしたい場合は、アプリ起動時に必ずファイルを消去する。
/* pathのファイルを削除 */
BOOL result = [fm removeItemAtPath:writableDBPath error:&error];
if (result) {
NSLog(@"ファイルを削除に成功:%@", writableDBPath);
} else {
NSLog(@"ファイルの削除に失敗:%@", error.description);
}
*/

BOOL result_flag = [fm fileExistsAtPath:writableDBPath];
if(!result_flag){

//dbが存在してなかったらここが呼ばれて、作成したDBをコピー

//Supporting Files内に置いたファイルのパス
//ここで null が帰ってきたりうまくコピーができなかったら、ファイルのコピーを許可していない可能性がある。許可の仕方はスクリプトのすぐ下に記述。

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"コピーしたいファイル.jpg"];

//こっちの記述でもいい

//NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"db"];

//コピーを実行

BOOL copy_result_flag = [fm copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if(!copy_result_flag){

//失敗したらここ

NSLog(@"コピーに失敗");
}
}

return YES;
}
--------------------------------------------------------------------

コピーするファイルは、あらかじめ許可しておく必要があるので、うまくコピーできない場合は許可されているか確認する。

targets > BuildPhase > Copy Bundle Resources
から適宜該当ファイルを追加すれば解消される。参考

//FMDB使っていて、データファイルをコピーしたときのスクリプトがこれ↓ 参考
--------------------------------------------------------------------
NSError *error;
NSFileManager *fm = [NSFileManager defaultManager];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"test.db"];
NSLog(@"writableDBPath;%@",writableDBPath);

BOOL result_flag = [fm fileExistsAtPath:writableDBPath];
if(!result_flag){
//dbが存在してなかったらここが呼ばれて、作成したDBをコピー
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.db"];

BOOL copy_result_flag = [fm copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if(!copy_result_flag){
//失敗したらここ
NSLog(@"データベースのコピーに失敗");
}
}

//作成したテーブルからデータを取得
FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath];
if ([db open]) {
[db setShouldCacheStatements:YES];

FMResultSet *rs = [db executeQuery:@"SELECT * FROM testdb"];
while ([rs next]) {
//ここでデータを展開
NSLog(@"データ展開%d %@", [rs intForColumn:@"id"], [rs stringForColumn:@"title"]);
}
[rs close];
[db close];
}else{
//DBが開けなかったらここ
}
--------------------------------------------------------------------

windowsのmysqlデータをmacのsqLiteで読み込む手順

windowsのmysqlデータをmacのsqLiteで読み込んだときの手順 覚書

1.phpmyadminからCVSファイルでデータをダウンロード。「1 行目にフィールド名を追加する」に必ずチェックを入れる。

2.Macにデータをコピー。Mac から Windows の共有ファイルにアクセスするときは、Finder 横の「サーバへ接続」から。

3.DB Browser for SQLiteにCVSファイルをインポート

「File」-「Import」-「Table from CSV file」の順に操作。
「Table from CSV file」は、あらかじめ DB Browser for SQLite でデータベースファイルを読み込んでおかないと選択できないので注意。

インポートが完了すると、拡張子なしのファイルが保存されるので、わかりやすく「~.db」や「~.sqlite」などとリネームするといい。

MacのターミナルからSQLiteを実行

MacのターミナルからSQLiteを実行したときの覚書

1.ターミナルの起動

Finder の「移動」-「アプリケーション」-「ユーティリティ」-「ターミナル」

2.ターミナルでSQLite の実行

データベースファイルのある場所まで cd で移動する。例えばデスクトップになる場合。

//コマンド
-------------
cd Desktop
-------------

移動したらデータベースファイルを指定して、デフォルトでインストールされている SQLite を起動。例としてデータベースファイル名を「test.db」だった場合。

//コマンド
-------------
sqlite3 test.db
-------------

するとターミナルに「sqlite>」と表示されるので、SQLを実行。

//抽出
-------------
sqlite> select * from testdb;
-------------

参考:こちら

【Objective-C】FMDBでテーブル内の情報を出力する

FMDBでテーブル内の情報を出力するソースコード

前提として

  1. FMDBが導入されている(導入方法はこちら)。
  2. test.dbというファイルが iOS Simulator の Documents ディレクトリにある(iOS Simulatorののパスについてはこちら)。このディレクトリに直接データファイルを置くと、シミュレーターのバージョンごとにデータファイルを置く必要があるので面倒。解決策として、Supporting Files 内にデータファイルを置いておいて、アプリ起動時に Supporting Files 内にデータがない場合に Documents ディレクトリにコピーする方法がある。詳しくは、こちら
  3. title というカラムにデータが既に入っている

ソースコード
----------------------------------------------------------------
//インポート(ヘッダーファイル)
#import "FMDatabase.h"
----------------------------------------------------------------

----------------------------------------------------------------
- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

// パスとDBファイル名を指定

NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);

NSString *dir = [paths objectAtIndex:0];

//test.db はファイル名
NSString *db_path = [dir stringByAppendingPathComponent:@"test.db"];

FMDatabase *db = [FMDatabase databaseWithPath:db_path];

//データを抽出

[db open];

//testdb はテーブル名
FMResultSet *rs = [db executeQuery:@"select id,title from testdb"];

while ([rs next]){

// 出力

NSString *text1 = [rs stringForColumn:@"title"];

//UIlabelクラスのインスタンスを生成。
//alloc でインスタンスの生成(allocationはメモリの割り当ての意)。init で初期化。
UILabel *label = [[UILabel alloc] init];

//labelオブジェクトにテキストを設定
label.text = text1;

//コンテンツの大きさの合わせてUIViewの大きさを変える。UIViewはUIlabelの親クラス。
[label sizeToFit];

//行数の指定。0は、表示可能な最大行数。(インスペクターでの設定も可だがソースが優先される)
label.numberOfLines = 0;

label.center = self.view.center;

[self.view addSubview:label];

// 出力 ここまで

}

[rs close];

}
----------------------------------------------------------------

結果をラベルに表示せずに、配列に入れる場合はスクリプト後半を以下のように変更する

----------------------------------------------------------------
//データを抽出

[db open];

FMResultSet *rs = [db executeQuery:@"select id,title from testdb"];

while ([rs next]){

// 出力

NSString *text1 = [rs stringForColumn:@"title"];

//配列を追加。配列の型は必ず NSMutableArray であること。NSMutableArray は不可。
[testArray addObject:text1];

//UIlabelクラスのインスタンスを生成。
//alloc でインスタンスの生成(allocationはメモリの割り当ての意)。init で初期化。
// UILabel *label = [[UILabel alloc] init];

//labelオブジェクトにテキストを設定
//label.text = text1;

//コンテンツの大きさの合わせてUIViewの大きさを変える。UIViewはUIlabelの親クラス。
//[label sizeToFit];

//label.center = self.view.center;

//[self.view addSubview:label];

// 出力 ここまで

}

[rs close];
----------------------------------------------------------------

【xcode】FMDB導入方法

FMDB は SQLite を iOS の Objective-C で扱いやすくするための Wrapper ライブラリ。GitHub で公開されている。

1.あらかじめ「libsqlite3.0.dylib」を追加しておく

SQLiteを使用するために「Targets」->「Build Phases」->「Link Binary With Libraries」から「libsqlite3.0.dylib」を追加しておく。

詳細はこちら

2.FMDBをアプリに組み込む

プログラムをこちらからダウンロード。

ダウンロードしたディレクトリ内のfmdb-master/src/ 配下にある fmdb というディレクトリを、ディレクトリXcodeのプロジェクトフォルダ内(プロジェクト名のフォルダ直下、MasterViewController.h などがあるところ)に xcode の project navigator エリアに直接ドラッグして置く。ただし、「fmdb.m」という名前のファイルだけ外しておく(main 関数が実装されていて、ビルド時にコンパイルエラーが出る)。

fmdb ディレクトリをプロジェクト内に置くときはナビゲーターエリアに直接ドラッグする

詳細はこちら

「Choose options for adding these files」のダイアログが出るので「Destination Copy items ~」にチェックを入れることでアプリに組み込める。

3.インポート

ソースコード
----------------------------------------------------------------
#import "FMDatabase.h"
----------------------------------------------------------------
ヘッダーファイル(.h)でも実装ファイル(.m)でもどちらでもいい。

ビルドしてエラーが出なければOK。