2012-03-20 24 views
1

如何在sqlite表名中添加'标记?Android sqlite表名'字符

用户创建表并且我想添加在表名中使用'标记的功能。

e.g Dad's stuff 

那么其他特殊字符如(_ -/, .)呢?

我试图

String newlist_listname = et_NewGroceryList.getText().toString(); 
unrecognized token: "'s_stuff 

newlist_listname.replaceAll("'", "\'"); 
unrecognized token: "'s_stuff 

newlist_listname.replaceAll("'", "\\'"); 
unrecognized token: "'s_stuff 

newlist_listname.replaceAll("'", "''"); 
syntax error: CREATE TABLE GL_Mom''s_stuff 

newlist_listname = "'" + newlist_listname.replaceAll("'", "''") + "'"; 
syntax error: CREATE TABLE GL_'Mom''s_stuff' 

newlist_listname = "'" + newlist_listname + "'"; 
syntax error: CREATE TABLE GL_'Mom's_stuff' 

newlist_listname = "'" + newlist_listname.replaceAll("'", "\'") + "'"; 
syntax error: CREATE TABLE GL_'Mom's_stuff' 

newlist_listname = "'" + newlist_listname.replaceAll("'", "\\'") + "'"; 
syntax error: CREATE TABLE GL_'Mom's_stuff' 

newlist_listname = "'" + newlist_listname.replaceAll("'", "''") + "'"; 
syntax error: CREATE TABLE GL_'Mom''s_stuff' 

newlist_listname = "\'" + newlist_listname.replaceAll("'", "\'") + "\'"; 
syntax error: CREATE TABLE GL_'Mom's_stuff' 

newlist_listname = "\\'" + newlist_listname.replaceAll("'", "\'") + "\\'"; 
unrecognized token: "\": CREATE TABLE GL_\'Mom's_stuff\' 

newlist_listname = "''" + newlist_listname.replaceAll("'", "\'") + "''"; 
syntax error: CREATE TABLE GL_''Mom's_stuff'' 

(我也有_代替空格)

有什么我还没有试过?

+0

可能重复的[我可以声明表名与转义序列在sqlite3?](http://stackoverflow.com/questions/7205345/can-i-declare-table-name-with-escape-sequences-in- sqlite3) – 2012-03-20 16:44:34

+0

将它包装在方括号内。 [爸爸的东西] – 2012-03-20 22:18:01

+0

语法错误:CREATE TABLE GL_ [Mom's_stuff]等等...... – erdomester 2012-03-20 22:30:23

回答

1

我假设这是用于某种列表制作应用程序?

不要为每个列表创建一个表。这是不好的数据库设计。所有列表条目创建一个表,该表中使用列来表示它们属于哪个列表 - 这样的事情:

+-----------+----------+--------------+ 
| list  | position | item   | 
+-----------+----------+--------------+ 
| Groceries | 1  | eggs   | 
| Groceries | 2  | butter  | 
| Groceries | 3  | milk   | 
| Hitlist | 1  | Guido  | 
| Hitlist | 2  | Franco  | 
... 

随着list的索引,这是一样快 - 快可能 - 比每个列表有一张表。

+0

是的。当用户创建一个新的列表项目时,新的记录被添加到表格中,并且还会创建一个具有相同名称的新表格。所以主表(列表)保存所有的表名 – erdomester 2012-03-20 22:31:03

+0

这就是我的想法。不要这样做。 – duskwuff 2012-03-20 22:38:46

+0

我想你的意思是我不应该使用收集器表。在列表视图中,我应该显示所有表格,这意味着收集器表不仅仅是糟糕的设计,而且也是不必要的? 编辑:现在发生在我身上,我可以将所有表的所有记录存储在一张表中,并将该指标列用作“表名”。我想,那就是你的意思。 – erdomester 2012-03-20 22:45:05

0

如果要在值中使用实际的单引号,则必须用另一个引号将其转义,因此在将其插入SQLite查询之前,需要将Dad's Stuff修改为Dad''s Stuff。在数据值中,当您将数据提供给whereArgs数组的insert()update(),query()delete()方法时,Android会为您执行此操作,但对于表名,您需要自行将其转义。

String.replace("'","''")应该做的伎俩。不确定表格名称,您可能需要预先用单引号将您传递的名称换行,即'Dad''s Stuff'

单引号(即撇号)确实是唯一的特例,因为它是用于转义SQL语句中所有其他字符的字符。换句话说,我可以安全地在SQL语句中传递一个字符串,如'(The_St/atement)',因为整件事情都用单引号引起来。

HTH