iOS Develop: Welche SQLBasis verwendet man und wie ?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • iOS Develop: Welche SQLBasis verwendet man und wie ?

    Hallo Forumuser und Userinnen ,

    Ich bin neu im Apple Development Bereich . Habe vorher mit Eclipse (java) gearbeitet und mit dem Visual Studio 2012 (VB.NET).
    Nun möchte auch im Apple Bereich etwas machen. :)

    Geplannt ist eine App mit Kochbuch und Bildergalerie für den Privaten Gebrauch.

    Gedacht habe ich da an eine App mit 3 Seiten :

    1. Frontpage
    2. Kochbuch
    3. Bildergalerie

    Frontpage ist schnell zusammen geklickt und auch die anderen "Views" stehen schon.

    Nun kommt für mich aber das Thema DB dazu und hier steh ich auf dem Schlauch ?(
    Ich habe eine .sqlite Datenbank mit Mehreren Tabellen in das Projekt eingebunden ( Files add to "My Project" )

    Nun habe ich diese in meinem Projekt , aber wie verknüpfe ich die , z.B. mit einer TableView , ich habe viele Tutorials abgegrast , aber nichts gefunden ( Meist Xcode 3.X oder älter.. )
    Gibt es irgendwo ein aktuelles Tutorial für DB Anwendungen unter Xcode 5 ?

    Eine Andere Frage : Gibt es sqlite Alternativen oder ist diese DB vollkommen ok ?

    Danke für die Hilfe :)


    E: Über die Suchfunktion hier im Forum habe ich leider auch nichts gefunden

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von TianBao () aus folgendem Grund: E: Über die Suchfunktion hier im Forum habe ich leider auch nichts gefunden

  • Moin!

    Du kommst ganz offensichtlich von einer ganz anderen Schiene. :)
    Apple gibt Dir für alles seine Ideallösung an die Hand und haut Dir Steine in den Weg, wenn Du es anders machen möchtest.

    An Stelle Deiner eigenen Datenbank solltest Du Dich in Core Data einarbeiten.
    Ein guter Einstiegspunkt ist meiner Meinung nach Apples Core Data Programming Guide.

    Im Gegensatz zu den Cursorn in Java und .NET bekommst Du unter iOS ausschließlich (mitunter recht komplexe) Objektgraphen an die Hand.
    Insofern ist der 'Ich habe meine Datenbank'-Ansatz bereits völlig falsch.

    Gut, einige Leute schwören auf ihre eigene SQLite Datenbank. Diese Leute wundern sich dann aber auch, wenn an diversen Ecken und Kanten etwas hakt.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Geht auch mit SQLite.

    Hier ein simpler TableView Controller als Beispiel:

    Gruß
    Manfred


    Quellcode

    1. #import "OCViewController.h"
    2. #import <sqlite3.h>
    3. @interface OCViewController ()
    4. @property (readonly) sqlite3 *databaseHandler;
    5. @property (readonly) NSMutableArray *data;
    6. @end
    7. @implementation OCViewController
    8. - (id)init
    9. {
    10. self = [super init];
    11. if (self) {
    12. _databaseHandler = NULL;
    13. _data = [[NSMutableArray alloc] init];
    14. [[self tableView] registerClass: [UITableViewCell class] forCellReuseIdentifier: @"Cell"];
    15. [self openDB];
    16. [self gatherData];
    17. UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemAdd
    18. target: self
    19. action: @selector(addRecord:)];
    20. [[self navigationItem] setRightBarButtonItem: add];
    21. [[NSNotificationCenter defaultCenter] addObserver: self
    22. selector: @selector(handleEnterBackground:)
    23. name: UIApplicationDidEnterBackgroundNotification
    24. object: nil];
    25. [[NSNotificationCenter defaultCenter] addObserver: self
    26. selector: @selector(handleAwakeFromBackground:)
    27. name: UIApplicationWillEnterForegroundNotification
    28. object: nil];
    29. }
    30. return self;
    31. }
    32. - (void) dealloc
    33. {
    34. [[NSNotificationCenter defaultCenter] removeObserver: self];
    35. }
    36. - (void) handleEnterBackground: (NSNotification *)note
    37. {
    38. [self closeDatabase];
    39. }
    40. - (void) handleAwakeFromBackground: (NSNotification *)note
    41. {
    42. [self openDB];
    43. [self gatherData];
    44. [[self tableView] reloadData];
    45. }
    46. - (void)didReceiveMemoryWarning
    47. {
    48. [super didReceiveMemoryWarning];
    49. }
    50. - (void) addRecord: (id) sender
    51. {
    52. UIAlertView *new = [[UIAlertView alloc] initWithTitle: @"Neuer Eintrag"
    53. message: @"Bitte deutlich schreiben!"
    54. delegate: self
    55. cancelButtonTitle: @"Doch nicht"
    56. otherButtonTitles: @"Einfügen", nil];
    57. [new setAlertViewStyle: UIAlertViewStylePlainTextInput];
    58. [new show];
    59. }
    60. - (void) alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
    61. {
    62. if (buttonIndex == 0)
    63. {
    64. return; // cancel
    65. }
    66. NSString *text = [[alertView textFieldAtIndex: 0] text];
    67. if (text == nil || [text isEqualToString: @""])
    68. {
    69. return; // mumpitz
    70. }
    71. [self insert: text];
    72. [self gatherData];
    73. NSIndexPath *path = [NSIndexPath indexPathForRow: [_data count] -1 inSection: 0];
    74. [[self tableView] insertRowsAtIndexPaths: @[path] withRowAnimation: UITableViewRowAnimationTop];
    75. }
    76. #pragma mark - Table view data source
    77. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    78. {
    79. return 1;
    80. }
    81. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    82. {
    83. return [_data count];
    84. }
    85. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    86. {
    87. NSInteger row = [indexPath row];
    88. static NSString *CellIdentifier = @"Cell";
    89. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    90. NSDictionary *record = [_data objectAtIndex: row];
    91. NSString *name = [record objectForKey: @"name"];
    92. [[cell textLabel] setText: name];
    93. return cell;
    94. }
    95. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    96. {
    97. if (editingStyle == UITableViewCellEditingStyleDelete)
    98. {
    99. NSInteger row = [indexPath row];
    100. NSDictionary *record = [_data objectAtIndex: row];
    101. NSNumber *theID = [record objectForKey: @"id"];
    102. [self deleteRecord: theID];
    103. [self gatherData];
    104. [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation: UITableViewRowAnimationTop];
    105. }
    106. }
    107. #pragma mark - Table view delegate
    108. #pragma mark SQLite
    109. - (NSString *) databasePath
    110. {
    111. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    112. NSString *path = [paths objectAtIndex: 0];
    113. return [path stringByAppendingPathComponent: @"data.db"];
    114. }
    115. - (BOOL) openDB
    116. {
    117. if (_databaseHandler != NULL)
    118. {
    119. return YES;
    120. }
    121. NSString *path = [self databasePath];
    122. NSFileManager *fm = [[NSFileManager alloc] init];
    123. BOOL firstRun = NO;
    124. if (![fm fileExistsAtPath: path])
    125. {
    126. firstRun = YES;
    127. }
    128. const char *dbpath = [path UTF8String];
    129. if (sqlite3_open(dbpath, &_databaseHandler) == SQLITE_OK)
    130. {
    131. NSLog(@"open ok");
    132. char *errMsg;
    133. const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT)";
    134. if (sqlite3_exec(_databaseHandler, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
    135. {
    136. NSLog(@"failed to create table");
    137. return NO;
    138. }
    139. return YES;
    140. // sqlite3_close(contactDB);
    141. }
    142. return NO;
    143. }
    144. - (BOOL) insert: (NSString *)name
    145. {
    146. sqlite3_stmt *statement;
    147. NSString *sql = [[NSString alloc] initWithFormat: @"INSERT INTO CONTACTS (name) VALUES ("%@")", name];
    148. //NSLog(@"query %@", sql);
    149. const char *sql_raw = [sql UTF8String];
    150. sqlite3_prepare_v2(_databaseHandler, sql_raw, -1, &statement, NULL);
    151. if (sqlite3_step(statement) == SQLITE_DONE)
    152. {
    153. NSLog(@"insert done");
    154. sqlite3_finalize(statement);
    155. return YES;
    156. }
    157. sqlite3_finalize(statement);
    158. return NO;
    159. }
    160. - (BOOL) gatherData
    161. {
    162. NSMutableArray *newArray = [[NSMutableArray alloc] init];
    163. sqlite3_stmt *statement;
    164. NSString *sql = [NSString stringWithFormat: @"SELECT id, name FROM contacts"];
    165. //NSLog(@"query %@", sql);
    166. const char *sql_raw = [sql UTF8String];
    167. if (sqlite3_prepare_v2(_databaseHandler, sql_raw, -1, &statement, NULL) != SQLITE_OK)
    168. {
    169. NSLog(@"prepare error");
    170. sqlite3_finalize(statement);
    171. return NO;
    172. }
    173. // iterate results
    174. while (sqlite3_step(statement) == SQLITE_ROW)
    175. {
    176. int the_id = sqlite3_column_int(statement, 0);
    177. NSNumber *obj_id = [NSNumber numberWithInt: the_id];
    178. const unsigned char * name_raw = sqlite3_column_text(statement, 1);
    179. NSString *name = [[NSString alloc] initWithUTF8String: (const char *)name_raw];
    180. NSDictionary *record = @{@"id": obj_id , @"name": name};
    181. [newArray addObject: record];
    182. }
    183. _data = newArray;
    184. sqlite3_finalize(statement);
    185. return YES;
    186. }
    187. - (BOOL) deleteRecord: (NSNumber *)recordID
    188. {
    189. sqlite3_stmt *statement;
    190. NSString *sql = @"DELETE FROM CONTACTS WHERE id=?";
    191. const char *sql_raw = [sql UTF8String];
    192. sqlite3_prepare_v2(_databaseHandler, sql_raw, -1, &statement, NULL);
    193. sqlite3_bind_int(statement, 1, [recordID intValue]);
    194. if (sqlite3_step(statement) == SQLITE_DONE)
    195. {
    196. sqlite3_finalize(statement);
    197. return YES;
    198. }
    199. NSLog(@"error");
    200. sqlite3_finalize(statement);
    201. return NO;
    202. }
    203. - (void) closeDatabase
    204. {
    205. sqlite3_close(_databaseHandler);
    206. _databaseHandler = NULL;
    207. }
    208. @end
    Alles anzeigen
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Ich habe nun einen TableController mit meiner Datenbank fertig gestellt.

    Diese Tabelle beinhaltet 5 Kategorien : Beilagen , Hauptgerichte, Olivenöle, Salate, Marinaden

    Jede dieser Kategorien hat eine eigene Tabelle mit Rezepteinträgen , und an diesem Punkt hänge ich .
    Wie kann ich aus dieser TableView meine Kategorien mit Rezepten aufrufen und anzeigen ?

    Grüße

    TianBao
  • Thallius schrieb:

    Das ist nicht wie in JAVA wo du nur fertige Frameworks zusammen Klickst.

    Ich empfinde es nicht als 'fertige Frameworks zusammen klicken', wenn man sich zu seiner spezifischen Abfrage erst mal durch den Cursor mit den Datensätzen hangeln darf.

    Das 'fertige Frameworks zusammen klicken' trifft da eher auf Core Data zu und sei deshalb zu empfehlen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • TianBao schrieb:

    Diese Tabelle beinhaltet 5 Kategorien : Beilagen , Hauptgerichte, Olivenöle, Salate, Marinaden

    Da Du ja offenbar die harte Tour bevorzugst: Kategorien unterscheiden sich an Hand ihrer Sektion. Du musst also gemäß der Section im Index Path die Tabelle wählen und gemäß der Row im Index Path die Zeile definieren. Darauf machst Du dann deine Abfrage und stopfst das Ergebnis dann entsprechend in die Zelle.

    Oder Du nimmst Core Data und machst es so, wie Apple es sich gedacht hat. ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • So dann nun hier eine generelle Frage bevor ich mich ganz verlaufe. :pinch:

    Angehängt wäre meine von mir erdachte ViewHierachie , ist diese überhaupt so umsetzbar ( Nutzungs-tauglich )

    Grüße und entschuldigt bitte meine Stümperhaften Anfänge in Xcode, diese Umgebung ist irgendwie ganz anders für mich ^^