мы можем свойство / синтезировать в объект базы данных sqlite3 *? - PullRequest
3 голосов
/ 05 декабря 2009

У меня есть фрагмент кода,

что похоже на это ...

#import <sqlite3.h>

@interface DatabaseClass : NSObject {

    sqlite3             *database;
}
@property ( nonatomic, retain ) database;//////this//////

@end

In the implementation file;

#import "DatabaseClass.h"

@implementation DatabaseClass

@synthesize database;//////this///////

@end

Мой вопрос: могу ли я это сделать (прокомментировал). А если нет, то в чем заключается работа?

Ответы [ 3 ]

5 голосов
/ 05 декабря 2009

эмпирическое тестирование показывает, что

@property (nonatomic, retain) database; 

не работает (конкретно не компилируется). Однако,

@property (nonatomic, assign) sqlite3 *database; 

делает.

4 голосов
/ 05 декабря 2009

Есть две проблемы с кодом.

Во-первых, объявление неверно;

@property ( nonatomic, retain ) database;

Компиляция генерирует сообщение об ошибке, например:

error: expected specifier-qualifier-list before 'database'

В коде отсутствует спецификатор типа. В частности, это должно выглядеть так:

@property ( nonatomic, retain ) sqlite3 *database;

Теперь, когда это исправлено, вы также увидите ошибку как на kevindtimm:

error: property 'database' with 'retain' attribute must be of object type

Измените @property на assign вместо retain.

Или, что еще лучше, используйте Core Data. Если у вас нет базы данных SQLite из какого-либо другого источника, для которого настроена схема, переход на SQLite напрямую является пустой тратой инженерного времени.

3 голосов
/ 06 декабря 2009

Вы не можете сделать это, потому что sqlite3 не является объектом Objective C. Сохраняемые свойства должны быть объективными объектами C. Один из простых способов сказать что-либо - это объект Objective C. Это, как правило, имя типа в CamelCase.

Дескриптор базы данных sqlite3 - это просто указатель на нормальную структуру языка Си. Вы можете сделать его назначенным свойством, но это означает, что соединение не будет автоматически закрываться, если вы назначите другое значение для свойства. Чтобы присвоить ему свойство, вам нужно сделать:

@property ( nonatomic, assign ) database;

Вы также хотите решить, действительно ли вы хотите так поступить. Вот два предложения:

  1. Рассмотрите возможность использования базовых данных. Для изучения требуется немного усилий, но не более, чем для изучения sqlite3, и он предоставляет множество функций, которых нет в sqlite.
  2. Вы можете подумать, почему вы представляете соединение sqlite3 как свойство. Класс менеджера баз данных, вероятно, должен иметь соединение sqlite3 в качестве закрытой переменной-члена. Создайте методы для DatabaseClass, чтобы открыть базу данных sqlite3, извлечь данные, добавить данные, закрыть базу данных и т. Д. Остальная часть вашей программы будет вызывать эти методы, но не будет знать, что DatabaseClass использует sqlite3 в фоновом режиме. Таким образом, если вы когда-нибудь решите изменить способ хранения ваших данных, вам просто нужно будет внести изменения в одном месте, а не менять все классы, взаимодействующие с DatabaseClass. (Один из способов, которыми Core Data может хранить свои данные, - это база данных sqlite3, так что вам, по сути, придется заново изобретать гораздо более простую версию Core Data.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...