2012-03-03 278 views
0

我创建了一个使用android sqlite数据库的示例应用程序,我的要求是How can i use Sqlite database in my android activity?(请不要链接此链接)。我用下面的代码来做到这一点,如何从android sqlite数据库中获取选定的id值?

MainClass.java

public class MainClass extends Activity implements OnClickListener { 

    Button NUM_INPUT; 
    EditText enter_NUM; 
    int number; 
    DatabaseHandler db = new DatabaseHandler(this); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sai_answers_home); 
     NUM_INPUT = (Button) findViewById(R.id.answerButton); 
     enter_NUM = (EditText) findViewById(R.id.saiAnssersEditText); 
     NUM_INPUT.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     if (v.getId() == R.id.answerButton) { 
      number = Integer.parseInt(this.enter_NUM.getText().toString()); 
      // /System.out.println("EDITTEXTVALUE" + number); 
      Log.d("Reading: ", "Reading all contacts.."); 
      List<Contact> contacts = db.getAllContacts(number); 
      for (Contact cn : contacts) { 
       String log = "Id: " + cn.getID() + " ,Name: " + cn.getName(); 
       // Writing Contacts to log 
       Log.d("Name: ", log); 
      } 
      db.close(); 
     } 
    } 
} 

DataBaseHandler.java

public class DatabaseHandler extends SQLiteOpenHelper { 

     // The Android's default system path of your application database. 
     private static String DB_PATH = "/data/data/com.sqlite.example/databases/"; 

     private static String DB_NAME = "answers"; 

     private SQLiteDatabase myDataBase; 

     private final Context myContext; 
     String myPath; 

     /** 
     * Constructor Takes and keeps a reference of the passed context in order to 
     * access to the application assets and resources. 
     * 
     * @param context 
     */ 
     public DatabaseHandler(Context context) { 

      super(context, DB_NAME, null, 1); 
      this.myContext = context; 
     } 

     /** 
     * Creates a empty database on the system and rewrites it with your own 
     * database. 
     * */ 
     public void createDataBase() throws IOException { 

      boolean dbExist = checkDataBase(); 

      if (dbExist) { 
       // do nothing - database already exist 
      } else { 

       // By calling this method and empty database will be created into 
       // the default system path 
       // of your application so we are gonna be able to overwrite that 
       // database with our database. 
       this.getReadableDatabase(); 

       try { 

        copyDataBase(); 

       } catch (IOException e) { 

        throw new Error("Error copying database"); 

       } 
      } 

     } 

     /** 
     * Check if the database already exist to avoid re-copying the file each 
     * time you open the application. 
     * 
     * @return true if it exists, false if it doesn't 
     */ 
     private boolean checkDataBase() { 

      SQLiteDatabase checkDB = null; 

      try { 
       myPath = DB_PATH + DB_NAME; 
       checkDB = SQLiteDatabase.openDatabase(myPath, null, 
         SQLiteDatabase.OPEN_READONLY); 

      } catch (SQLiteException e) { 

       // database does't exist yet. 

      } 

      if (checkDB != null) { 

       checkDB.close(); 

      } 

      return checkDB != null ? true : false; 
     } 

     /** 
     * Copies your database from your local assets-folder to the just created 
     * empty database in the system folder, from where it can be accessed and 
     * handled. This is done by transfering bytestream. 
     * */ 
     private void copyDataBase() throws IOException { 

      // Open your local db as the input stream 
      InputStream myInput = myContext.getAssets().open(DB_NAME); 

      // Path to the just created empty db 
      String outFileName = DB_PATH + DB_NAME; 

      // Open the empty db as the output stream 
      OutputStream myOutput = new FileOutputStream(outFileName); 

      // transfer bytes from the inputfile to the outputfile 
      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = myInput.read(buffer)) > 0) { 
       myOutput.write(buffer, 0, length); 
      } 

      // Close the streams 
      myOutput.flush(); 
      myOutput.close(); 
      myInput.close(); 

     } 

     public void openDataBase() throws SQLException { 

      // Open the database 
      myPath = DB_PATH + DB_NAME; 
      myDataBase = SQLiteDatabase.openDatabase(myPath, null, 
        SQLiteDatabase.OPEN_READONLY); 

     } 

     @Override 
     public synchronized void close() { 

      if (myDataBase != null) 
       myDataBase.close(); 

      super.close(); 

     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 

     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     } 

     // Add your public helper methods to access and get content from the 
     // database. 
     // You could return cursors by doing "return myDataBase.query(....)" so it'd 
     // be easy 
     // to you to create adapters for your views. 

     public List<Contact> getAllContacts(int muNumber) { 
      List<Contact> contactList = new ArrayList<Contact>(); 
      // Select All Query 
      String selectQuery = "SELECT * FROM ANSWER WHERE ID= " + muNumber; 
    System.out.println("QUERY STRING IS......>>>>>> " + selectQuery); 

      SQLiteDatabase db = this.getWritableDatabase(); 
      Cursor cursor = db.rawQuery(selectQuery, null); 

      // looping through all rows and adding to list 
      if (cursor.moveToFirst()) { 
       do { 
        Contact contact = new Contact(); 
        contact.setID(Integer.parseInt(cursor.getString(0))); 
        contact.setName(cursor.getString(1)); 
        // contact.setPhoneNumber(cursor.getString(2)); 
        // Adding contact to list 
        contactList.add(contact); 
       } while (cursor.moveToNext()); 
      } 

      // return contact list 
      return contactList; 
     } 
} 

answers.db

database image

当我执行此代码时出现错误,“android.database.sqlite.SQLiteException:no such table:ANSWER:,while compiling:SELECT * FROM ANSWER WHERE ID = 3”。我确切的要求是,当单击MainActivity类中的Button时,输入的值将传递到数据库。最后搜索数据库并返回数据库中的相应值。例如,我输入2并点击按钮,从数据库中我会得到“橙色”,我怎么能实现这一点。提前致谢。

回答

1

“SELECT * FROM答案在ID =”

但就不得不提到的“‘SELECT * FROM答案在ID’

由于表名是回答不回答

1

你已经提到了变量DB_NAME =“answers”中的表名,并且在查询中你试图访问表名ANSWER。它唯一的拼写错误。

在你所提到的选择查询
+0

我改变了它,但是会出现同样的错误 – Aerrow 2012-03-03 03:44:52

+1

很奇怪,请尝试清理你的代码并重新执行,因为这是我能看到的唯一错误 – Android 2012-03-03 03:47:26

相关问题