hi,
I'm using sqlite in android system recently, here is how my programe running:
1: there is an original sqlite db in apk
2: when apk installed, I copy the db file from apk to a writable space, simply
SD Card in android system
3: download some files from internet and then replace them to sqlite if needed
4: all things above is running in main thread
the software running well in most cases, but sometimes step(3) failed in some
mobile phone, the return code is "SQLITE_READONLY"
I'm very confuse about it and search google but finds nothing
My codes is something like this:
==========================================================================
[1]OPEN
int open_flags = SQLITE_OPEN_READWRITE| SQLITE_OPEN_FULLMUTEX|
SQLITE_OPEN_SHAREDCACHE;
if (PathTool::IsFileExsit(db_file_name.c_str()))
{
sqlite3_open_v2(db_file_name.c_str(), &sqlite_db, open_flags, ...);
...
}
....
[2]WRITE
std::string sql_info;
sqlite3_stmt *statement = 0;
bool is_suc = false;
sql_info = "replace into file_info( hash0, ...) values(?,...)";
int ret = sqlite3_prepare_v2(sqlite_db, sql_info.c_str(), -1,
&statement, NULL);
if (ret == SQLITE_OK)
{
sqlite3_bind_int(statement, 1, file_info.hash_info.hash0);
...
ret = sqlite3_step(statement);
if(ret == SQLITE_DONE || ret == SQLITE_OK)
{
is_suc = true;
}
else
{
CCLog("sqlite step error, ret code: %d", ret);
}
}
else
{
CCLog("sqlite prepare error, ret code: %d", ret);
}
==========================================================================
the code is failed in function sqlite3_step and return code is
"SQLITE_READONLY"
we all know that, files in apk is readonly
firstly, I doubt that file property is inherited from its original file and it
will leads the error
so I try to make sure the file copy from apk is writable, codes(java):
public static boolean setFilePrilivege(String path)
{
File file = new File(path);
boolean ret = false;
if (file.exists())
{
try
{
ret = file.setWritable(true);
ret &= file.setReadable(true);
ret &= file.setExecutable(true);
}
catch(Exception e)
{
e.printStackTrace();
}
return ret;
}
return false;
}
before write, I also detect whether the file is writable in operating system,
codes(java):
public static boolean isFileWritable(String path)
{
File file = new File(path);
if (file.exists())
{
return file.canWrite();
}
return false;
}
finally, I find that even I set the file writable and operating system tells
me that file is writable too, the results is still failed, with return code:
"SQLITE_READONLY"
Please help me, thanks
Best Regards
ckwei