-1

您好,我正在使用以下代码在应用程序中实现 SQLite 数据库。朋友们还有其他最简单的方法来实现这一点,它适用于 SQLite 数据库的所有内容。

   // .h File of DBManager

#import <Foundation/Foundation.h>
#import <sqlite3.h>

@interface DBOperation : NSObject 
{
}

+(void)OpenDatabase:(NSString*)path;  //Open the Database
//+(void)finalizeStatements;//Closing and do the final statement at application exits
+(void)checkCreateDB;
//+(int) getLastInsertId;
+(BOOL) executeSQL:(NSString *)sqlTmp;
+(NSMutableArray*) selectData:(NSString *)sql;
@end
    //
//  DBOperation.m
//  Puzzle
//
//  Created by hbmac1 on 9/22/09.
//  Copyright 2009 __MyCompanyName__. All rights reserved.
//

#import "DBOperation.h"

static sqlite3 *database = nil;
static int conn;
@implementation DBOperation


+(void)checkCreateDB
{
    @try {
        NSString *dbPath,*databaseName;

        databaseName=@"pointtable.sqlite";

        NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
        NSString *docDir = [docPaths objectAtIndex:0];
        dbPath = [docDir stringByAppendingPathComponent:databaseName];
        BOOL success;
        NSFileManager *fm = [NSFileManager defaultManager];
        success=[fm fileExistsAtPath:dbPath];
        if(success)
        {
            [self OpenDatabase:dbPath];
            return;
        }
        NSString *dbPathFromApp=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
        [fm copyItemAtPath:dbPathFromApp toPath:dbPath error:nil];
        [self OpenDatabase:dbPath];

    }
    @catch (NSException *exception) {
        NSLog(@"%@",[exception reason]);

    }
}

//Open database
+ (void) OpenDatabase:(NSString*)path
{
    @try
    {
        conn = sqlite3_open([path UTF8String], &database);
        if (conn == SQLITE_OK) {
        }
        else
            sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.
    }   
    @catch (NSException *e) {
        NSLog(@"%@",e); 
    }   
}



+(NSMutableArray*) selectData:(NSString *)sql
{
    @try 
    {
        if (conn == SQLITE_OK) 
        {
            sqlite3_stmt *stmt = nil;
            if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &stmt, NULL) != SQLITE_OK) {
                [NSException raise:@"DatabaseException" format:@"Error while creating statement. '%s'", sqlite3_errmsg(database)];
            }
            NSMutableArray *obj = [[NSMutableArray alloc]init];
            int numResultColumns = 0;
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                numResultColumns = sqlite3_column_count(stmt);
                @autoreleasepool {
                    NSMutableDictionary *tmpObj = [[NSMutableDictionary alloc]init];
                    for(int i = 0; i < numResultColumns; i++){
                        if(sqlite3_column_type(stmt, i) == SQLITE_INTEGER){

                            const char *name = sqlite3_column_name(stmt, i);
                            NSString *columnName = [[NSString alloc]initWithCString:name encoding:NSUTF8StringEncoding];
                            [tmpObj setObject:[NSString stringWithFormat:@"%i",sqlite3_column_int(stmt, i)] forKey:columnName];

                        } else if (sqlite3_column_type(stmt, i) == SQLITE_FLOAT) {

                            const char *name = sqlite3_column_name(stmt, i);
                            NSString *columnName = [[NSString alloc]initWithCString:name encoding:NSUTF8StringEncoding];

                            [tmpObj setObject:[NSString stringWithFormat:@"%f",sqlite3_column_double(stmt, i)] forKey:columnName];
                        } else if (sqlite3_column_type(stmt, i) == SQLITE_TEXT) {
                            const char *name = sqlite3_column_name(stmt, i);
                            NSString *tmpStr = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, i)];
                            if ( tmpStr == nil) {
                                tmpStr = @"";
                            }
                            NSString *columnName = [[NSString alloc]initWithCString:name encoding:NSUTF8StringEncoding];
                            [tmpObj setObject:tmpStr forKey:columnName];

                        } else if (sqlite3_column_type(stmt, i) == SQLITE_BLOB) {

                        }     
                        else if (sqlite3_column_type(stmt, i) == SQLITE_NULL) {
                            const char *name = sqlite3_column_name(stmt, i);
                            NSString *tmpStr = @"";

                            NSString *columnName = [[NSString alloc]initWithCString:name encoding:NSUTF8StringEncoding];
                            [tmpObj setObject:tmpStr forKey:columnName];
                        }

                    }
                    [obj addObject:tmpObj];

                }
            }
            return obj;
        } else {
            return nil;
        }
    }
    @catch (NSException *exception) {
        NSLog(@"%@",[exception reason]);
        return nil;
    }
 }

+(BOOL) executeSQL:(NSString *)sqlTmp {
    @try {
        if(conn == SQLITE_OK) {     

            const char *sqlStmt = [sqlTmp cStringUsingEncoding:NSUTF8StringEncoding];
            sqlite3_stmt *cmp_sqlStmt1;
            int returnValue = sqlite3_prepare_v2(database, sqlStmt, -1, &cmp_sqlStmt1, NULL);

            returnValue == SQLITE_OK ?  NSLog(@"\n Inserted \n") :NSLog(@"\n Not Inserted \n");

            sqlite3_step(cmp_sqlStmt1);
            sqlite3_finalize(cmp_sqlStmt1);

            if (returnValue == SQLITE_OK)
            {
                return TRUE;
            }
        }
        return FALSE;

    }
    @catch (NSException *exception) {
        NSLog(@"%@",[exception reason]);
        return NO;
    }
}

@end
4

2 回答 2

0

检查FMDB,它非常强大且易于使用

于 2015-06-18T07:15:28.370 回答
0

(void)viewDidLoad { [超级 viewDidLoad]; // 在加载视图后做任何额外的设置,通常是从一个 nib。NSString *docsDir; NSArray *dirPaths; dirPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); docsDir=[dirPaths objectAtIndex:0]; databasePath=[[NSString alloc]initWithString:[docsDir stringByAppendingPathComponent:@"eventDb.db"]]; NSFileManager *filemgr=[NSFileManager defaultManager]; const char *dbpath=[databasePath UTF8String]; if(sqlite3_open(dbpath, &eventDb)==SQLITE_OK) { char *errmsg; const char *sql_stmt="CREATE TABLE IF NOT EXISTS EVENT(EVENTID INTEGER PRIMARY KEY AUTOINCREMENT,ENAME TEXT,ETIME TEXT,TIMAGE TEXT)"; if(sqlite3_exec(eventDb,sql_stmt,NULL,NULL,&errmsg)!=SQLITE_OK) { NSLog(@"falied"); } sqlite3_close(eventDb); } 其他 { NSLog(@" NSArray *dirPaths; dirPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); docsDir=[dirPaths objectAtIndex:0]; databasePath=[[NSString alloc]initWithString:[docsDir stringByAppendingPathComponent:@"eventDb.db"]]; const char *dbpath=[databasePath UTF8String]; sqlite3_stmt *语句;if(sqlite3_open(dbpath,&eventDb)==SQLITE_OK) { NSString *querySQL=[NSString stringWithFormat:@"SELECT ENAME,ETIME,TIMAGE FROM EVENT "]; const char *query_stmt=[querySQL UTF8String]; if(sqlite3_prepare_v2(eventDb,query_stmt,-1,&statment,NULL)==SQLITE_OK) { while(sqlite3_step(statment)==SQLITE_ROW) { NSString [docsDir stringByAppendingPathComponent:@"eventDb.db"]]; const char *dbpath=[databasePath UTF8String]; sqlite3_stmt *语句;if(sqlite3_open(dbpath,&eventDb)==SQLITE_OK) { NSString *querySQL=[NSString stringWithFormat:@"SELECT ENAME,ETIME,TIMAGE FROM EVENT "]; const char *query_stmt=[querySQL UTF8String]; if(sqlite3_prepare_v2(eventDb,query_stmt,-1,&statment,NULL)==SQLITE_OK) { while(sqlite3_step(statment)==SQLITE_ROW) { NSString [docsDir stringByAppendingPathComponent:@"eventDb.db"]]; const char *dbpath=[databasePath UTF8String]; sqlite3_stmt *语句;if(sqlite3_open(dbpath,&eventDb)==SQLITE_OK) { NSString *querySQL=[NSString stringWithFormat:@"SELECT ENAME,ETIME,TIMAGE FROM EVENT "]; const char *query_stmt=[querySQL UTF8String]; if(sqlite3_prepare_v2(eventDb,query_stmt,-1,&statment,NULL)==SQLITE_OK) { while(sqlite3_step(statment)==SQLITE_ROW) { NSStringename=[[NSString alloc]initWithUTF8String:(const char )sqlite3_column_text(statment, 0)]; NSString eTIme=[[NSString alloc]initWithUTF8String:(const char )sqlite3_column_text(statment, 1)]; NSString IMAGENAME=[[NSString alloc]initWithUTF8String:(const char)sqlite3_column_text(statment, 2)]; 事件 *g=[[事件分配] 初始化]; g.eventname=ename; g.eventime=eTIME; g.eventImagename=图像名称;[_arr addObject:g] } sqlite3_finalize(statment); } sqlite3_close(eventDb); } //tableview -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [_tool count]; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *myId=@"myID"; UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:myId]; if (cell==nil) { [[NSBundle mainBundle]loadNibNamed:@"royalkitCell" owner:self options:nil]; 单元格=_toolCell;cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator; } NSString *tname=[_tool objectAtIndex: indexPath.row]; _toolLabel=(UILabel *)[cell viewWithTag:10]; _toolLabel.text=tname; 返回单元格;} 标题

于 2016-02-10T05:07:35.180 回答