我的 sqlite prepare 语句有些困难。我收到一条错误消息,说我的表不存在,尽管我已经在多个地方检查过它,但它确实存在,所以我很困惑。
数据库存在并且运行我的 sql 语句让我得到 结果符合我的预期。
- (NSMutableArray *) getMyWorkout{
NSMutableArray *workoutArray = [[NSMutableArray alloc] init];
@try {
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"IOSDB.sqlite"];
NSLog(@"Db path is %@",dbPath);
BOOL success = [fileMgr fileExistsAtPath:dbPath];
if(!success) {
NSLog(@"Cannot locate database file '%@'.", dbPath);
}
if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)){
sqlite3_close(db);
NSLog(@"Failed to open database with message '%s'.", sqlite3_errmsg(db));
}
const char *sql = "SELECT Id, type, difficulty, duration, description FROM workoutTbl";
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK){
NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(db), sqlite3_errcode(db));
} //...
当我运行它时,我得到了文件路径和下面的错误
2013-02-01 18:07:08.060 TriShake[9251:c07] -[MyWorkoutList getMyWorkout] Prepare failure 'no such table: workoutTbl' (1)
我已经检查了这些其他问题,但无法找到解决方案
我知道如果数据库路径不存在,sqlite3_open() 会为你创建一个空数据库,但我知道它存在,所以挫败感接踵而至。如果您能给我任何帮助或指导,我们将不胜感激。
最佳答案
就您的直接问题而言,这将是一些简单的事情。
你说你已经“清理并重新构建”,但你真的从你的模拟器中删除了旧的应用程序吗?要么手动删除应用程序,要么更简单,通过从“iOS 模拟器”菜单中选择“重置内容和设置”来完全重置模拟器。有时 Xcode 不太清楚要复制哪些文件(特别是在这种情况下,您在设备上运行它可能会更改模拟器包中文件的时间戳!)
再次运行应用。
如果该应用程序没有按预期运行,请从 Mac 打开模拟器文件夹中的数据库并检查数据库以确保表格在那里并且与您预期的完全一样。所以导航到应用程序,打开包(您可能必须选择“显示包内容”选项),确认数据库的存在,但同样重要的是,在您最喜欢的 Mac sqlite3 中打开数据库的这个特定副本选择的工具并确认那里的表的存在。
让我们知道您发现了什么。同样,它必须是简单的东西,例如:
也许重建应用程序的过程并没有重新安装所有内容;在我的模拟器上安装期间,我偶尔会遇到 Xcode 选择不重新复制某些内容的问题;
也许您项目中的数据库不小心放在了一个子目录中,更糟糕的是,您可能有两个副本位于不同的目录中;
可能您的 Xcode 项目中的数据库在表格或文件的名称中丢失(或有拼写错误或(尤其是在设备的情况下)文件名大写不正确);
等
对于其中的许多错误,在完全重置模拟器本身之前,您不会注意到问题。可能有一百万个小问题,但希望完全重置模拟器并重新开始将帮助您找到问题。当涉及到这类问题时,总是很简单。
一些其他的小观察:
您可能不应该从 bundle 中打开数据库。以编程方式将其从 bundle 复制到 Documents 文件夹,然后从那里打开数据库。我知道这似乎没有必要,但它很重要,原因有很多(如果数据库在应用程序运行期间发生变化,如果数据库不小心在你身上创建,不要让 Xcode 对发生变化的事情感到困惑(即使只有文件时间戳)在 Xcode 背后改变的 bundle 等)
如果您需要数据库,您应该使用 sqlite3_open_v2 ,使用 SQLITE_OPEN_READWRITE 或 SQLITE_OPEN_READONLY 作为标志(但不要包含 SQLITE_OPEN_CREATE )。让 sqlite 有机会为您创建一个空白数据库或以其他方式修改它会让人头疼,所以永远不要给它这样的机会。
关于iphone - sqlite 准备语句错误-没有这样的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14656894/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie