-1

我写了一些代码。它不会给出错误,但它根本不起作用。

当我尝试调试它时,它说:不幸的是,您的应用程序已停止。
请帮助我,我是开发新手

数据库助手类是

public class DatabaseHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION=1;
private static final String DATABASE_NAME= "permitManager",
TABLE_CONTACTS ="contacts",
KEY_ID = "id",
KEY_CAR="car",
KEY_STATUS="status",
KEY_IMAGEURI="imageUri";
public DatabaseHandler(Context context){
 super(context, DATABASE_NAME,null,DATABASE_VERSION);
   }
  @Override
public void onCreate(SQLiteDatabase db){
      db.execSQL("CREATE TABLE " + TABLE_CONTACTS +""+ KEY_ID + " INTEGER PRIMARY," + KEY_CAR + "TEXT," + KEY_STATUS + "TEXT," + KEY_IMAGEURI + "TEXT,");
  }
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
    db.execSQL("DROP TABLE IF EXISTS"+ TABLE_CONTACTS);
    onCreate(db);
}
public void createContact(Contact contact){
    SQLiteDatabase db = getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_CAR,contact.getCar());
    values.put(KEY_STATUS,contact.getStatus());
    values.put(KEY_IMAGEURI, contact.getimageURI().toString());
    db.insert(TABLE_CONTACTS,null,values);
    db.close();
}

public Contact getContact(int id){
    SQLiteDatabase db =getReadableDatabase();
    Cursor cursor =db.query(TABLE_CONTACTS, new String[]{KEY_ID,KEY_CAR,KEY_STATUS,KEY_IMAGEURI},KEY_ID + "=?" , new String[]{String.valueOf(id)},null,null,null);
    if(cursor!=null)
        cursor.moveToFirst();
    Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),cursor.getString(1),cursor.getString(2), Uri.parse(cursor.getString(3)));

    db.close();
    cursor.close();
        return contact;
    }
 public void  deleteContact(Contact contact){
    SQLiteDatabase db = getWritableDatabase() ;
    db.delete(TABLE_CONTACTS,KEY_ID+"=?",new String[]{String.valueOf(contact.getid())});
    db.close();
}

public int getContactCount(){
    SQLiteDatabase db= getReadableDatabase();
    Cursor cursor =db.rawQuery("SELECT * FROM" + TABLE_CONTACTS,null);
    int count = cursor.getCount();
    db.close();
    cursor.close();
    return count;
}
public int updateContact(Contact contact){
    SQLiteDatabase db= getWritableDatabase();
ContentValues values =  new ContentValues();

    values.put(KEY_CAR,contact.getCar());
    values.put(KEY_STATUS,contact.getStatus());
    values.put(KEY_IMAGEURI, contact.getimageURI().toString());
    db.insert(TABLE_CONTACTS,null,values);
return db.update(TABLE_CONTACTS,values,KEY_ID +"=?",new String[]{String.valueOf(contact.getid())});
}
public List<Contact> getAllContacts(){
    List<Contact> contacts = new ArrayList<>();
    SQLiteDatabase db = getWritableDatabase();
    Cursor cursor =db.rawQuery("SELECT * FROM"+ TABLE_CONTACTS,null);
    if (cursor.moveToFirst()){
        do {
            Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),cursor.getString(1),cursor.getString(2),Uri.parse(cursor.getString(3)));
            contacts.add(contact);
        }
        while (cursor.moveToNext());
   }
    return contacts;
}
}

主要活动类是

public class MainActivity extends ActionBarActivity {


 EditText carTxt, statusTxt;
 ImageView contactImageImgView;
 List<Contact> Contacts = new ArrayList<Contact>();
 ListView contactListView;
 Uri imageUri=null;
 DatabaseHandler dbHandler;



 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     carTxt = (EditText) findViewById(R.id.txtCar);
     statusTxt = (EditText) findViewById(R.id.txtStatus);
     contactListView = (ListView) findViewById(R.id.listView);
     contactImageImgView = (ImageView) findViewById(R.id.imgViewContactImage);
     dbHandler = new DatabaseHandler(getApplicationContext());


     TabHost tabHost = (TabHost) findViewById(R.id.tabHost);


     tabHost.setup();
     TabHost.TabSpec tabSpec = tabHost.newTabSpec("Creator");
     tabSpec.setContent(R.id.Creator);
     tabSpec.setIndicator("Creator");
     tabHost.addTab(tabSpec);

     tabSpec = tabHost.newTabSpec("List");
     tabSpec.setContent(R.id.List);
     tabSpec.setIndicator("List");
     tabHost.addTab(tabSpec);


     final Button addBtn = (Button) findViewById(R.id.btnAdd);


     addBtn.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             Contact contact = new Contact(dbHandler.getContactCount(),String.valueOf(carTxt.getText()),String.valueOf(statusTxt.getText()),imageUri);
             dbHandler.createContact(contact);
             Contacts.add(contact);
             populateList();
             Toast.makeText(getApplicationContext(), carTxt.getText().toString() + " has been add to list", Toast.LENGTH_SHORT).show();
         }
     });
     carTxt.addTextChangedListener(new TextWatcher() {
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {

         }

         @Override
         public void onTextChanged(CharSequence s, int start, int before, int count) {
             addBtn.setEnabled(!carTxt.getText().toString().trim().isEmpty());

         }

         @Override
         public void afterTextChanged(Editable s) {

         }
     });

     contactImageImgView.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             Intent intent = new Intent();
             intent.setType("image/*");
             intent.setAction(Intent.ACTION_GET_CONTENT);
             startActivityForResult(Intent.createChooser(intent, "Select Contact Image"), 1);

         }
     });



      List<Contact> addableContacts = dbHandler.getAllContacts();
        int contactcount = dbHandler.getContactCount();
     for(int i =0;i< contactcount;i++) {
         Contacts.add(addableContacts.get(1));
     }
     if(!addableContacts.isEmpty())
         populateList();
 }

 public void onActivityResult(int reqcode, int rescode, Intent data){
     if(rescode == RESULT_OK){
         if(reqcode == 1){
             imageUri = data.getData();
             contactImageImgView.setImageURI(data.getData());
         }
     }
 }


 private void populateList() {
     ArrayAdapter<Contact> adapter = new ContactListAdapter();
     contactListView.setAdapter(adapter);
 }


 private class ContactListAdapter extends ArrayAdapter<Contact> {
     public ContactListAdapter() {
         super(MainActivity.this, R.layout.listview_item, Contacts);
     }

     @Override
     public View getView(int position, View view, ViewGroup parent) {
         if (view == null)
             view = getLayoutInflater().inflate(R.layout.listview_item, parent, false);
         Contact currentContact = Contacts.get(position);

         TextView car = (TextView) view.findViewById(R.id.contactname);
         car.setText(currentContact.getCar());
         TextView status = (TextView) view.findViewById(R.id.status);
         status.setText(currentContact.getStatus());
         ImageView img = (ImageView) view.findViewById(R.id.img);
         img.setImageURI(currentContact.getimageURI());
         return view;
     }

 }
}

logcat 是

08-27 05:17:06.704  13110-13110/com.newthinktank.helloworld E/Trace﹕ error opening trace file: No such file or directory (2)
08-27 05:17:06.759  13110-13110/com.newthinktank.helloworld I/System.out﹕ Sending WAIT chunk
08-27 05:17:06.759  13110-13110/com.newthinktank.helloworld W/ActivityThread﹕ Application com.newthinktank.helloworld is waiting for the debugger on port 8100...
08-27 05:17:06.766  13110-13117/com.newthinktank.helloworld I/dalvikvm﹕ Debugger is active
08-27 05:17:06.962  13110-13110/com.newthinktank.helloworld I/System.out﹕ Debugger has connected
08-27 05:17:06.962  13110-13110/com.newthinktank.helloworld I/System.out﹕ waiting for debugger to settle...
08-27 05:17:07.157  13110-13110/com.newthinktank.helloworld I/System.out﹕ waiting for debugger to settle...
08-27 05:17:07.360  13110-13110/com.newthinktank.helloworld I/System.out﹕ waiting for debugger to settle...
08-27 05:17:07.563  13110-13110/com.newthinktank.helloworld I/System.out﹕ waiting for debugger to settle...
08-27 05:17:07.759  13110-13110/com.newthinktank.helloworld I/System.out﹕ waiting for debugger to settle...
08-27 05:17:07.962  13110-13110/com.newthinktank.helloworld I/System.out﹕ waiting for debugger to settle...
08-27 05:17:08.165  13110-13110/com.newthinktank.helloworld I/System.out﹕ waiting for debugger to settle...
08-27 05:17:08.368  13110-13110/com.newthinktank.helloworld I/System.out﹕ debugger has settled (1343)
08-27 05:17:08.766  13110-13110/com.newthinktank.helloworld W/dalvikvm﹕ VFY: unable to find class referenced in signature (Landroid/view/SearchEvent;)
08-27 05:17:08.766  13110-13110/com.newthinktank.helloworld I/dalvikvm﹕ Could not find method android.view.Window$Callback.onSearchRequested, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onSearchRequested
08-27 05:17:08.774  13110-13110/com.newthinktank.helloworld W/dalvikvm﹕ VFY: unable to resolve interface method 14046: Landroid/view/Window$Callback;.onSearchRequested (Landroid/view/SearchEvent;)Z
08-27 05:17:08.774  13110-13110/com.newthinktank.helloworld D/dalvikvm﹕ VFY: replacing opcode 0x72 at 0x0002
08-27 05:17:08.774  13110-13110/com.newthinktank.helloworld I/dalvikvm﹕ Could not find method android.view.Window$Callback.onWindowStartingActionMode, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onWindowStartingActionMode
08-27 05:17:08.774  13110-13110/com.newthinktank.helloworld W/dalvikvm﹕ VFY: unable to resolve interface method 14050: Landroid/view/Window$Callback;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
08-27 05:17:08.774  13110-13110/com.newthinktank.helloworld D/dalvikvm﹕ VFY: replacing opcode 0x72 at 0x0002
08-27 05:17:10.149  13110-13110/com.newthinktank.helloworld I/dalvikvm﹕ Could not find method android.view.ViewGroup.onRtlPropertiesChanged, referenced from method android.support.v7.widget.Toolbar.onRtlPropertiesChanged
08-27 05:17:10.149  13110-13110/com.newthinktank.helloworld W/dalvikvm﹕ VFY: unable to resolve virtual method 13947: Landroid/view/ViewGroup;.onRtlPropertiesChanged (I)V
08-27 05:17:10.149  13110-13110/com.newthinktank.helloworld D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0007
08-27 05:17:10.173  13110-13110/com.newthinktank.helloworld I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
08-27 05:17:10.173  13110-13110/com.newthinktank.helloworld W/dalvikvm﹕ VFY: unable to resolve virtual method 403: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
08-27 05:17:10.173  13110-13110/com.newthinktank.helloworld D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
08-27 05:17:10.173  13110-13110/com.newthinktank.helloworld I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
08-27 05:17:10.173  13110-13110/com.newthinktank.helloworld W/dalvikvm﹕ VFY: unable to resolve virtual method 425: Landroid/content/res/TypedArray;.getType (I)I
08-27 05:17:10.173  13110-13110/com.newthinktank.helloworld D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
08-27 05:17:10.563  13110-13110/com.newthinktank.helloworld I/dalvikvm﹕ Could not find method android.content.res.Resources.getDrawable, referenced from method android.support.v7.internal.widget.ResourcesWrapper.getDrawable
08-27 05:17:10.563  13110-13110/com.newthinktank.helloworld W/dalvikvm﹕ VFY: unable to resolve virtual method 366: Landroid/content/res/Resources;.getDrawable (ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
08-27 05:17:10.563  13110-13110/com.newthinktank.helloworld D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
08-27 05:17:10.563  13110-13110/com.newthinktank.helloworld I/dalvikvm﹕ Could not find method android.content.res.Resources.getDrawableForDensity, referenced from method android.support.v7.internal.widget.ResourcesWrapper.getDrawableForDensity
08-27 05:17:10.563  13110-13110/com.newthinktank.helloworld W/dalvikvm﹕ VFY: unable to resolve virtual method 368: Landroid/content/res/Resources;.getDrawableForDensity (IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
08-27 05:17:10.563  13110-13110/com.newthinktank.helloworld D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
08-27 05:17:11.485  13110-13110/com.newthinktank.helloworld E/SQLiteLog﹕ (1) near "FROMcontacts": syntax error
08-27 05:17:11.493  13110-13110/com.newthinktank.helloworld D/AndroidRuntime﹕ Shutting down VM
08-27 05:17:11.493  13110-13110/com.newthinktank.helloworld W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40b762a0)
08-27 05:17:11.665  13110-13110/com.newthinktank.helloworld E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity  ComponentInfo{com.newthinktank.helloworld/com.newthinktank.helloworld.MainActivi ty}: android.database.sqlite.SQLiteException: near "FROMcontacts": syntax error  (code 1): , while compiling: SELECT * FROMcontacts
at  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:
at  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2174)
at android.app.ActivityThread.access$700(ActivityThread.java:141)
at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:1267)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5059)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.database.sqlite.SQLiteException: near "FROMcontacts": syntax error (code 1): , while compiling: SELECT * FROMcontacts
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at              android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnecti     on.java:882)
at         android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
at     android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>    (SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>    (SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
at com.newthinktank.helloworld.DatabaseHandler.getAllContacts(DatabaseHandler.java:83)
at com.newthinktank.helloworld.MainActivity.onCreate(MainActivity.java:106)
at android.app.Activity.performCreate(Activity.java:5058)
at     android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2174)
at android.app.ActivityThread.access$700(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1267)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5059)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at            com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
at dalvik.system.NativeStart.main(Native Method)
08-27 05:17:12.266  13110-13110/com.newthinktank.helloworld I/Process﹕ Sending signal. PID: 13110 SIG: 9
4

1 回答 1

2

这是您的错误(末尾缺少空格、括号+额外的逗号):

db.execSQL("CREATE TABLE " + TABLE_CONTACTS +""+ KEY_ID + " INTEGER PRIMARY," + KEY_CAR + "TEXT," + KEY_STATUS + "TEXT," + KEY_IMAGEURI + "TEXT,");

和(两次!!)

Cursor cursor =db.rawQuery("SELECT * FROM" + TABLE_CONTACTS,null);

 db.execSQL("DROP TABLE IF EXISTS"+ TABLE_CONTACTS);

这是修复:

db.execSQL("CREATE TABLE " + TABLE_CONTACTS +" ("+ KEY_ID + " INTEGER PRIMARY, " + KEY_CAR + " TEXT, " + KEY_STATUS + " TEXT, " + KEY_IMAGEURI + " TEXT)");

和(两次!!)

Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CONTACTS, null);

 db.execSQL("DROP TABLE IF EXISTS "+ TABLE_CONTACTS);
于 2015-08-26T18:23:56.303 回答