【问题标题】:Problem when trying to iterate through a string array for execSQL尝试遍历 execSQL 的字符串数组时出现问题
【发布时间】:2011-08-04 13:15:25
【问题描述】:

我该怎么做:(为什么它不起作用?-模拟器结束应用程序而没有错误消息)

String [] aSQL;
aSQL = new String[50];

aSQL[0] = "CREATE TABLE tbl_team ("+
    "_id INTEGER PRIMARY KEY AUTOINCREMENT, "+
    "teamName TEXT NOT NULL);";

aSQL[1] = "CREATE TABLE tbl_cardType ("+
    "_id INTEGER PRIMARY KEY AUTOINCREMENT, "+
    "cardTypeName TEXT NOT NULL);";

for (int i = 0; i < aSQL.length; i++){
    db.execSQL(aSQL[i]);
}

不必这样做:

db.execSQL(aSQL[0])
db.execSQL(aSQL[1])

如果有人想知道我为什么要这样做。这是因为我的时间很紧,不知道其他方法。我尝试在 SQLite 浏览器中创建数据库但失败了。将其放入 assets 文件夹并在安装期间将其复制。

当然要运行的 SQL 命令远不止 2 个。

非常感谢您的任何帮助。

【问题讨论】:

  • 你的 logcat 说什么?您说模拟器在没有任何错误消息的情况下结束了您的应用程序。通常模拟器只会说强制关闭或 ANR。
  • 已经在 LogCat 中查看过,没有发现问题,没有红线,表示被信号 (11) 终止。我通常会收到您提到的错误消息,但在这种情况下不会,谢谢
  • 只是天真-它的编写方式,它是否也尝试做db.execSQL(aSQL[2])(然后是3,4,...),因为aSQL [2]没有初始化? aSQL.length 应该是 50,不是吗?
  • Joubarc 可能是对的。我对 .length 是否给出数组大小或初始化了多少变量有误解。

标签: android arrays sqlite iteration


【解决方案1】:

您可以在资产中包含一个 create_tables.sql 文件,然后在应用启动时执行它,如下所示:

InputStreamReader ir = new InputStreamReader(getAssets().open("create_tables.sql"));
BufferedReader br = new BufferedReader(ir);
SQLiteDatabase db = SQLiteDatabase.openDatabase(getDatabasePath("database.sqlite").getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE|SQLiteDatabase.CREATE_IF_NECESSARY);
String l;
while ((l = br.readLine()) != null) db.execSQL(l);

更新:

好吧,假设你有

class MyApp extends Application {
  public static Application appContext;
  public void oncreate() { 
    appContext = this;

  }
}

然后你几乎可以像上面那样做任何地方

BufferedReader br = new BufferedReader(new InputStreamReader(MyApp.appContext.getAssets().open("create_tables.sql")));

【讨论】:

  • 嗨,我试过了。它说 getAssets 和 getDatabasePath 方法是未定义的。你是说把它放在我的主类而不是我的 DbAdapter 类中吗?如果是这样,每次应用程序运行时都会运行它,我不希望那样,并认为我应该从处理数据库的 DbAdapter 类中运行这种东西 create 和 update 。对不起,我是 Java/Android 编程的新手并且很困惑。谢谢
  • getAssets 和 getDatabasePath 是 Context 的方法,所以只需将一个 Context(Activity 和 Application 实例都是上下文)传递给您的 DbAdapter。
  • 谢谢,我会在星期一试用并提供反馈
  • 我又看了一遍,但还是不明白。我尝试用这个和许多其他东西作为前缀,我不只是懒惰。我没有时间去了解所有事情的细节,比如什么是这样的;在我编写我的 android 应用程序之前,方法和上下文以及传递上下文。我需要边走边学,希望你或这个社区的其他人能帮助我。非常感谢
猜你喜欢
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多