2012-03-19 56 views
0

我有一个问题,而以下thenewboston的Android图坦卡蒙的游标或ContentValues无法读取我的SQLite数据? :d

所以第一个问题是,我敢肯定,我按照他所做过确切,但是这一次我的应用程序不能正常工作。

很抱歉,如果我的职位将是太长,您可以编辑它,如果你可以让我的问题明确

所以这是一个SQLiteExample类,我延长活动时间:

public class SQLiteExample extends Activity implements OnClickListener{ 
Button sqlUpdate, sqlView; 
EditText sqlName, sqlHotness; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sqlliteexample); 

    sqlUpdate = (Button) findViewById(R.id.bSqlUpdate); 
    sqlView = (Button) findViewById(R.id.bSqlopenView); 
    sqlName = (EditText) findViewById(R.id.etSqlName); 
    sqlHotness = (EditText) findViewById(R.id.etSqlHot); 

    sqlUpdate.setOnClickListener(this); 
    sqlView.setOnClickListener(this); 
} 

public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    switch(arg0.getId()){ 
    case R.id.bSqlUpdate : 

     boolean didItWork = true; 

     try { 
      String name = sqlName.getText().toString(); 
      String hotness = sqlHotness.getText().toString(); 

      HotOrNot entry = new HotOrNot(SQLiteExample.this); 
      entry.open(); 
      entry.createEntry(name, hotness); 
      entry.close(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      didItWork = false; 
      String error = e.toString(); 
      Dialog d = new Dialog(this); 
      d.setTitle("Dang It!"); 
      TextView tv = new TextView(this); 
      tv.setText(error); 
      d.setContentView(tv); 
      d.show(); 
     }finally{ 
      if(didItWork){ 
       Dialog d = new Dialog(this); 
       d.setTitle("Heck Yea!"); 
       TextView tv = new TextView(this); 
       tv.setText("Success"); 
       d.setContentView(tv); 
       d.show(); 
      } 
     } 
     break; 
    case R.id.bSqlopenView : 
     Intent i = new Intent("com.thenewboston.tama.SQLView"); 
     startActivity(i); 
     break; 
    } 
} 

我只是setOnClickListener( )这些2按钮在这里。

这是我HotOrNot类持有SQLite的东西的:

public class HotOrNot { 

public static final String KEY_ROWID = "_id"; 
public static final String KEY_NAME = "persons_name"; 
public static final String KEY_HOTNESS = "persons_hotness"; 

private static final String DATABASE_NAME = "HotOrNotdb"; 
private static final String DATABASE_TABLE = "peopleTable"; 
private static final int DATABASE_VERSION = 1; 

private DbHelper ourHelper; 
private final Context ourContext; 
private SQLiteDatabase ourDatabase; 

private static class DbHelper extends SQLiteOpenHelper {  

    public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
       KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       KEY_NAME + " TEXT NOT NULL, " + 
       KEY_HOTNESS + "TEXT NOT NULL); " 
     ); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 
    } 

} 

public HotOrNot(Context c){ 
    ourContext = c; 
} 
//????????????????????? 
public HotOrNot open() throws SQLException{ 
    ourHelper = new DbHelper(ourContext); 
    ourDatabase = ourHelper.getWritableDatabase(); 
    return this; 
} 

public void close(){ 
    ourHelper.close(); 
} 

public long createEntry(String name, String hotness) { 
    // TODO Auto-generated method stub 
    ContentValues cv = new ContentValues(); 
    cv.put(KEY_NAME, name); 
    cv.put(KEY_HOTNESS, hotness); 
    return ourDatabase.insert(DATABASE_TABLE, null, cv); 
} 
public String getData() { 
    // TODO Auto-generated method stub 
    String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_HOTNESS}; 
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 
    String result = ""; 

    int iRow = c.getColumnIndex(KEY_ROWID); 
    int iName = c.getColumnIndex(KEY_NAME); 
    int iHotness = c.getColumnIndex(KEY_HOTNESS); 

    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
     result += c.getString(iRow) + " " + c.getString(iName) + " " +c.getString(iHotness) + "\n"; 
    } 

    return result; 
} 

这是我SQLView扩展活动(为第二个按钮):

public class SQLView extends Activity{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sqlview); 

    TextView tv = (TextView) findViewById(R.id.tvSQLinfo); 
    HotOrNot info = new HotOrNot(this); 
    info.open(); 
    String data = info.getData(); 
    info.close(); 

    tv.setText(data); 
} 

这是错误,我当我点击我的SQLiteExample类中的R.id.bSqlopenView按钮时得到:

03-19 14:47:54.504: I/Database(335): sqlite returned: error code = 1, msg = table peopleTable has no column named persons_hotness 

And a很多错误的再次编辑的第一个

后:这是我的完整版本错误列表:d

03-19 14:47:28.194: D/dalvikvm(335): GC_EXTERNAL_ALLOC freed 50K, 53% free 2554K/5379K, external 1625K/2137K, paused 107ms 
03-19 14:47:49.634: W/KeyCharacterMap(335): No keyboard for id 0 
03-19 14:47:49.634: W/KeyCharacterMap(335): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
03-19 14:47:54.504: I/Database(335): sqlite returned: error code = 1, msg = table peopleTable has no column named persons_hotness 
03-19 14:47:54.515: E/Database(335): Error inserting persons_hotness= persons_name= 
03-19 14:47:54.515: E/Database(335): android.database.sqlite.SQLiteException: table peopleTable has no column named persons_hotness: , while compiling: INSERT INTO peopleTable(persons_hotness, persons_name) VALUES(?, ?); 
03-19 14:47:54.515: E/Database(335): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
03-19 14:47:54.515: E/Database(335): at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92) 
03-19 14:47:54.515: E/Database(335): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65) 
03-19 14:47:54.515: E/Database(335): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83) 
03-19 14:47:54.515: E/Database(335): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41) 
03-19 14:47:54.515: E/Database(335): at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1149) 
03-19 14:47:54.515: E/Database(335): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1569) 
03-19 14:47:54.515: E/Database(335): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1426) 
03-19 14:47:54.515: E/Database(335): at com.thenewboston.tama.HotOrNot.createEntry(HotOrNot.java:70) 
03-19 14:47:54.515: E/Database(335): at com.thenewboston.tama.SQLiteExample.onClick(SQLiteExample.java:46) 
03-19 14:47:54.515: E/Database(335): at android.view.View.performClick(View.java:2485) 
03-19 14:47:54.515: E/Database(335): at android.view.View$PerformClick.run(View.java:9080) 
03-19 14:47:54.515: E/Database(335): at android.os.Handler.handleCallback(Handler.java:587) 
03-19 14:47:54.515: E/Database(335): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-19 14:47:54.515: E/Database(335): at android.os.Looper.loop(Looper.java:123) 
03-19 14:47:54.515: E/Database(335): at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-19 14:47:54.515: E/Database(335): at java.lang.reflect.Method.invokeNative(Native Method) 
03-19 14:47:54.515: E/Database(335): at java.lang.reflect.Method.invoke(Method.java:507) 
03-19 14:47:54.515: E/Database(335): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-19 14:47:54.515: E/Database(335): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-19 14:47:54.515: E/Database(335): at dalvik.system.NativeStart.main(Native Method) 
+1

删除现有的数据库,然后再试一次。您的数据库已经创建完毕后,您可能试图添加表** persons_hotness **,但未能这样做。 – waqaslam 2012-03-19 08:22:22

+0

谢谢,先生,但如何重新创建我的数据库?我试图创建一个新的模拟器(我认为它会自动重新创建我的数据库,但它仍然不工作:D) 你是什么意思添加表persons_hotness先生?有一个名为“peopleTable” 对不起,如果我不明白,我刚刚了解SQLite .. 谢谢先生:D – 2012-03-19 08:26:15

+1

oops,我的意思是*列* ** persons_hotness **。 – waqaslam 2012-03-19 08:33:28

回答

1

把一个空间在创建数据库StringKEY_HOTNESS后,这样反而:

//... 
KEY_HOTNESS + "TEXT NOT NULL); " 

写:

//... 
    KEY_HOTNESS + " TEXT NOT NULL); " 
+0

OMG..This是疯狂的...它的工作! 有人可以告诉我什么是继续?(我没有SQL背景) btw对不起,我的长时间响应和谢谢先生:D – 2012-03-22 10:13:14

+0

是一样的,如果我想创建一个int然后我写这个: int a; 但是这次我忘了给这个空间,所以它变成这样: inta; – 2012-03-22 10:16:41

+1

@BlazeTama这就是发生了什么事,当你创建表时...... KEY_HOTNESS +“TEXT NOT NULL”实际上变成了'...... persons_hotnessTEXT',当你查询那个'KEY_HOTNESS'表时你将找不到它 – Luksprog 2012-03-22 11:00:25

1

更新数据库的版本号,它应该删除并重新创建数据库修复任何缺少的列:

private static final int DATABASE_VERSION = 2; // previously 1 
+0

谢谢先生,但它仍然无法工作:D – 2012-03-19 08:46:05

+1

粘贴您的整个日志 – waqaslam 2012-03-19 08:53:53

+0

错误..你是说这是先生? 03-19 14:47:54.515:E /数据库(335):错误插入persons_hotness = persons_name = 或全部错误日志(超长) 感谢爵士:d – 2012-03-19 09:14:52