Ty *_*ers 1 java database sqlite android listview
我正在构建一个简单的多活动列表应用程序来练习 SQLite。我试图从数据库中获取字符串以在listview启动时显示。我收到错误
\n\n\njava.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 \'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()\'
\n
这是代码
\n\npublic class MainActivity extends AppCompatActivity {\n SharedPreferences sharedPreferences;\n ArrayList<String> listItem;\n ArrayAdapter adapter;\n ListView lv = (ListView) findViewById(R.id.list_view);\n DatabaseHelper db = new DatabaseHelper(this);\n Context context;\n\n @Override\n protected void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n setContentView(R.layout.activity_main);\n Toolbar toolbar = findViewById(R.id.toolbar);\n setSupportActionBar(toolbar);\n listItem = new ArrayList<>();\n viewData();\n context = this;\n\n FloatingActionButton fab = findViewById(R.id.fab);\n fab.setOnClickListener(new View.OnClickListener() {\n @Override\n public void onClick(View view) {\n startActivity(new Intent(MainActivity.this, textInput.class));\n }\n });\n }\n\n // cast from sql database to the listview\n private void viewData() {\n Cursor res = db.viewData();\n\n if (res.getCount() == 0 ){\n Toast.makeText(this,"No Data!",Toast.LENGTH_SHORT).show();\n }\n else{\n while (res.moveToNext()){\n listItem.add(res.getString(1));\n }\n adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,listItem);\n lv.setAdapter(adapter);\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这是数据库助手:
\n\npublic class DatabaseHelper extends SQLiteOpenHelper {\npublic static final String DATABASE_NAME = "item.db";\npublic static final String TABLE_NAME = "item_table";\npublic static final String ID = "item_id";\npublic static final String NAME = "item_name";\npublic static final String PRICE = "item_price";\npublic static final String URL = "item_url";\n\npublic DatabaseHelper(@Nullable Context context) {\n super(context, DATABASE_NAME, null, 1);\n}\n\n@Override\npublic void onCreate(SQLiteDatabase db) {\n db.execSQL("create table " + TABLE_NAME +" ( item_id INTEGER PRIMARY \nKEY AUTOINCREMENT,item_name TEXT,item_price INTEGER,item_url TEXT) ");\n}\n\n@Override\npublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);\n onCreate(db);\n}\n\npublic boolean insertData(String name, String price, String url){\n SQLiteDatabase db = this.getWritableDatabase();\n ContentValues contentValues = new ContentValues();\n contentValues.put(NAME, name);\n contentValues.put(PRICE, price);\n contentValues.put(URL, url);\n long result = db.insert(TABLE_NAME,null,contentValues);\n if(result == -1)\n return false;\n else\n return true;\n}\n\n\npublic Cursor viewData(){\n SQLiteDatabase db = this.getReadableDatabase();\n Cursor res = db.rawQuery("select * from "+TABLE_NAME,null);\n return res;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这是文本输入活动
\n\npublic class textInput extends AppCompatActivity {\nSharedPreferences sharedPreferences;\n// Editor editor;\n// Context _context;\n// int PRIVATE_MODE = 0;\n// private static final String PREF_NAME = "Items";\n// public static final String NAME_LIST = "name";\n\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n setContentView(R.layout.activity_text_input);\n //DatabaseHelper db;\n\n //return\'s to main activity on press\n Button addButton = (Button) findViewById(R.id.addButton);\n final EditText name = (EditText) findViewById(R.id.itemName);\n final EditText url = (EditText) findViewById(R.id.itemURL);\n final EditText price = (EditText) findViewById(R.id.itemPrice);\n // final SharedPreferences sharedPreferences = \ngetApplicationContext().getSharedPreferences("items", 0);\n final DatabaseHelper db = new DatabaseHelper(this);\n addButton.setOnClickListener(new View.OnClickListener() {\n @Override\n public void onClick(View v) {\n //Checks to make sure that all fields are filled out, if yes \nthen returns to MainActivity\n if (name.length() != 0 && price.length() != 0 && url.length() \n !=0){\n boolean isInserted = \ndb.insertData(name.getText().toString(),\n price.getText().toString(),\n url.getText().toString());\n if(isInserted == true)\n Toast.makeText(textInput.this, "New Item Added", \n Toast.LENGTH_SHORT).show();\n else\n Toast.makeText(textInput.this, "Failed to Add", \nToast.LENGTH_SHORT).show();\n //The graphic and the return to MainActivity\n Intent returnToMain = new Intent(getApplicationContext(), \nMainActivity.class);\n startActivity(returnToMain);\n }\n else{\n Toast.makeText(textInput.this, "Please fill out all \nfields!", Toast.LENGTH_SHORT).show();\n }\n\n }\n });\nRun Code Online (Sandbox Code Playgroud)\n\n调试(错误?)日志
\n\nE/AndroidRuntime: FATAL EXCEPTION: main\n Process: com.example.xmaswishlist, PID: 25470\n java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.xmaswishlist/com.example.xmaswishlist.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method \'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()\' on a null object reference\n at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2841)\n at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)\n at android.app.ActivityThread.-wrap11(Unknown Source:0)\n at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)\n at android.os.Handler.dispatchMessage(Handler.java:105)\n at android.os.Looper.loop(Looper.java:164)\n at android.app.ActivityThread.main(ActivityThread.java:6944)\n at java.lang.reflect.Method.invoke(Native Method)\n at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)\n Caused by: java.lang.NullPointerException: Attempt to invoke virtual method \'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()\' on a null object reference\n at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:163)\n at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:157)\n at android.content.Context.obtainStyledAttributes(Context.java:655)\n at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:692)\n at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:659)\n at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:479)\n at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:214)\n at com.example.xmaswishlist.MainActivity.<init>(MainActivity.java:36)\n at java.lang.Class.newInstance(Native Method)\n at android.app.Instrumentation.newActivity(Instrumentation.java:1180)\n at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2831)\n at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)\xc2\xa0\n at android.app.ActivityThread.-wrap11(Unknown Source:0)\xc2\xa0\n at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)\xc2\xa0\n at android.os.Handler.dispatchMessage(Handler.java:105)\xc2\xa0\n at android.os.Looper.loop(Looper.java:164)\xc2\xa0\n at android.app.ActivityThread.main(ActivityThread.java:6944)\xc2\xa0\n at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)\xc2\xa0\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试使用以下方法修复此问题:
\n\n\n您尝试在设置内容之前获取视图setContentView,这会导致exception. 实例化ListView并DatabaseHelper在里面onCreate。
ListView lv;
DatabaseHelper db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
lv = (ListView) findViewById(R.id.list_view);
db = new DatabaseHelper(this);
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8402 次 |
| 最近记录: |