SQLiteでデータをアプリから追加する方法
ObjectiveCを用いてiPhoneアプリ製作の勉強をしています。
SQLiteを使って、データをアプリから追加したいのですが、その処理をするコードの記述方法が分かりません。
NSString *sql = @"CREATE TABLE IF NOT EXISTS members (year INTEGER PRIMARY KEY,month INTEGER,day INTEGER);";
NSString *insert_sql = @"INSERT INTO members (year,month,day) VALUES(?,?,?)”;
NSString *select_sql = @"SELECT year,month,day FROM members”;
特に以上3行の処理の記述方法が分からず、自分なりに考えてこのように記述し試してみましたが
storyboard上に追加したボタンを押してDataMakeメソッドを実行するときに
”EXC_BAD_ACCES”というエラーが出てしまいました。
以下にコードを晒します。
■ViewController.h
yearF,monthF,dayFをプロパティ宣言しています。
■ViewController.m
#import "ViewController.h"
#import "FMDatabase.h"
@interface ViewController ()
- (IBAction)DataMake:(id)sender;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *db_path = [self sqlmethod];
NSLog(@"%@",db_path);
FMDatabase *db = [FMDatabase databaseWithPath:db_path];
NSString *sql = @"CREATE TABLE IF NOT EXISTS members (year INTEGER PRIMARY KEY,month INTEGER,day INTEGER);";
[db open];
[db executeUpdate:sql];
[db close];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (NSString*) sqlmethod{
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *dir = [paths objectAtIndex:0];
return [dir stringByAppendingPathComponent:@"dayData.db"];
}
- (IBAction)DataMake:(id)sender {
NSString *db_path = [self sqlmethod];
FMDatabase *db = [FMDatabase databaseWithPath:db_path];
NSString *insert_sql = @"INSERT INTO members (year,month,day) VALUES(?,?,?)";
_yearF = 2014;
_monthF = 3;
_dayF = 23;
[db open];
[db executeUpdate:insert_sql,@"%d",_yearF,@"%d",_monthF,@"%d",_dayF];
[db close];
[self dataopen];
}
-(void)dataopen
{
NSString *db_path = [self sqlmethod];
FMDatabase *db = [FMDatabase databaseWithPath:db_path];
NSString *select_sql = @"SELECT year,month,day FROM members";
[db open];
FMResultSet *result = [db executeQuery:select_sql];
while ([result next]) {
int result_year = [result intForColumn:@"year"];
NSLog(@"recodeyear[%d]",result_year);
}
}
@end
以下のリンクを参考にし、”SQLiteを使用するためのライブラリ「libsqlite3.0.dylib」を追加”という項目までは出来ています。
http://blog.oukasoft.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/%E3%80%90iphone%E3%82%A2%E3%83%97%E3%83%AA%E3%80%91sqlite%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%81fmdb%E3%80%81lita/
お礼
最終的な目的には至っておりませんが、大幅な前進となりました、 理解を深めることは大切ですね、ご丁寧なアドバイス、本当にありがとうございました。
補足
C#でやってみました NuGetパッケージ管理からSystem.Data.SQLiteやMicrosoft.Data.Sqliteをそれぞれで試行錯誤試しましたが 暗号化パスワードdbの接続はできませんでした。NuGetのは非対応?(コンパイルは正常終了なのだが) 今度は、System.Data.SQLite.dllを個別ダウンロードして、参照追加で行ったところ以下のコードでPupSQLiteで暗号化パスワード化したdbの接続に成功しました。 sqlite-netFx46-static-binary-bundle-Win32-2015-1.0.99.0.zipをダウンロード、展開されたSystem.Data.SQLite.dllをソリューションに参照追加 vs2019 ターゲットフレームワーク.NET Framework 4.6.1 using System; using System.Data.SQLite; namespace msSqlApp3 { class Program { static void Main(string[] args) { var connectionStringBuilde = new SQLiteConnectionStringBuilder { DataSource = @"C:\temp\sample.db", Password = "psw" }; var cn = new SQLiteConnection(connectionStringBuilde.ToString()); cn.Open(); var cmd = cn.CreateCommand(); cmd.CommandText = "select * from ListA;"; var reader = cmd.ExecuteReader(); while (reader.Read()) { Console.WriteLine(reader["MemberID"].ToString()); Console.WriteLine(reader["Fast_name"].ToString()); Console.WriteLine(reader["Last_name"].ToString()); } } } }