诚信求一个答案,能解决问题必定采纳!
我定义了数据库DBHelper继承SQLiteOpenHelper,MainActivity里放置四个滑动的fragment,里面fragment要打开数据库要怎么写?context一直填不对。
fragment有空的构造方法CommunityFragment()、自带的onCreateView(),还有一个自己写的onActivityCreated()方法,通过getActivity().findViewById()获取控件的代码都写在onActivityCreated()方法里。
我想知道DBHelper dbHelper = new DBHelper(context);这句应该写在哪里?是最外层还是哪个方法内部?
上面的context应该填什么?
我写在最外层,然后填getActivity().getApplicationContext()、getContent()没有成功
写在onActivityCreated()里,再填getActivity().getApplicationContext()、getContent()还是没有成功。
DBHelper代码:
public class DBHelper extends SQLiteOpenHelper {
//声明数据库名,版本号,表名
private static final String DB_NAME = "DB_ChangShou.db";
private static final int DB_VERSION = 1;
public static final String table_Accounts = "Accounts";
public DBHelper(Context context) {
super(context,DB_NAME,null,DB_VERSION);//上下文,数据库名,空,版本号
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建用户信息数据表Accounts:_id,账号,昵称,密码
String sql = "CREATE TABLE IF NOT EXISTS "+DBHelper.table_Accounts+"(_id INTEGER PRIMARY KEY AUTOINCREMENT,account VARCHAR(20),name VARCHAR(20),password VARCHAR(10))";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
MainActivity代码:
public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener, ViewPager.OnPageChangeListener {
ViewPager viewPager;
BottomNavigationView bottomNavigationView;
HomeFragment homeFragment = new HomeFragment();
CommunityFragment communityFragment = new CommunityFragment();
MallFragment mallFragment = new MallFragment();
MineFragment mineFragment = new MineFragment();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();//初始化
}
private void init() {
//获取页面标签对象
viewPager = findViewById(R.id.viewPager);
viewPager.setOnPageChangeListener(this);//添加页面切换监视器
bottomNavigationView = findViewById(R.id.bottomNavigation);
bottomNavigationView.setOnNavigationItemSelectedListener(this);//添加导航栏选择监视器
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {//给页面添加适配器
@NonNull
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:return homeFragment;
case 1:return communityFragment;
case 2:return mallFragment;
case 3:return mineFragment;
}
return null;
}
@Override
public int getCount() {//界面个数
return 4;
}
});
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
@Override
public void onPageSelected(int position) {
bottomNavigationView.getMenu().getItem(position).setChecked(true);
}
@Override
public void onPageScrollStateChanged(int state) { }
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
viewPager.setCurrentItem(item.getOrder());
return true;
}
}
fragment代码:
public class MineFragment extends Fragment {
public MineFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_mine, container, false);
// Inflate the layout for this fragment
return view;
}
//前面代码是创建fragment时自动生成的,删除了多余的,上面两个方法没有动,自己写的代码在onActivityCreated()里
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// 这里数据库没有打开,显示空指针错误,可能是context出了问题
DBHelper dbHelper = new DBHelper(getContext());
SQLiteDatabase db = dbHelper.getReadableDatabase();
// 点击“修改身材”按钮
//控件都是通过加上getActivity()获取的
Button btnModifyFigure = getActivity().findViewById(R.id.mine_button_modifyFigure);
btnModifyFigure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getContext(), ModifyFigureActivity.class);
startActivity(intent);
}
});
}
}
回答引用ChatGPT:您可以在fragment的onActivityCreated()方法中获取context,因为在此方法中,fragment已经与activity关联并且activity的onCreate()方法已经完成。
在onActivityCreated()方法中,您可以使用以下代码获取context:
Context context = getContext();
如果您使用的是support库,则可以使用以下代码:
Context context = requireContext();
然后,您可以使用获取到的context创建DBHelper对象,如下所示:
DBHelper dbHelper = new DBHelper(context);
在您的代码示例中,您可以在MineFragment的onActivityCreated()方法中使用以下代码来打开数据库:
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
DBHelper dbHelper = new DBHelper(requireContext());
SQLiteDatabase db = dbHelper.getReadableDatabase();
Button btnModifyFigure = getActivity().findViewById(R.id.mine_button_modifyFigure);
btnModifyFigure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getContext(), ModifyFigureActivity.class);
startActivity(intent);
}
});
}
如果数据库在访问时没有正确打开,则会抛出NullPointerException异常。您可能需要检查您的DBHelper类以确保它正确地创建和打开数据库。
在Fragment中获取Context的最佳方式是通过调用getContext()方法来获取。所以你可以在onCreate()或onCreateView()方法中获取Context。在这个例子中,你可以在onCreateView()方法中获取Context,并将其传递给DBHelper类的构造函数。
你可以在onCreateView()方法中添加以下代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_mine, container, false);
DBHelper dbHelper = new DBHelper(getContext());
SQLiteDatabase db = dbHelper.getReadableDatabase();
Button btnModifyFigure = view.findViewById(R.id.mine_button_modifyFigure);
btnModifyFigure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getContext(), ModifyFigureActivity.class);
startActivity(intent);
}
});
return view;
}
在这里,getContext()方法将返回与Fragment关联的上下文,你可以将其传递给DBHelper类的构造函数来打开数据库。在此之后,你可以像正常使用数据库一样使用它。
该回答引用ChatGPT
public class MineFragment extends Fragment {
private Context mContext;
public MineFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_mine, container, false);
// Inflate the layout for this fragment
return view;
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// 这里数据库没有打开,显示空指针错误,可能是context出了问题
DBHelper dbHelper = new DBHelper(mContext);
SQLiteDatabase db = dbHelper.getReadableDatabase();
// 点击“修改身材”按钮
//控件都是通过加上getActivity()获取的
Button btnModifyFigure = getActivity().findViewById(R.id.mine_button_modifyFigure);
btnModifyFigure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getContext(), ModifyFigureActivity.class);
startActivity(intent);
}
});
}
}
我按照上面改的,不过execSQL()还是问题,是不是我修改数据库语句有错误?
//创建数据库代码
// 创建用户购买商品数据表,账号account - String型,金币golds - int型,商品购买情况goods1~9 - int型
String s ="CREATE TABLE IF NOT EXISTS "+DBHelper.table_Goods+"(_id INTEGER PRIMARY KEY AUTOINCREMENT,account VARCHAR(20),golds INT,goods1 INT,goods2 INT,goods3 INT,goods4 INT,goods5 INT,goods6 INT,goods7 INT,goods8 INT,goods9 INT)";
db.execSQL(s);
//修改数据库代码,Current_golds是int型数据,account是String型
String sql = "update "+DBHelper.table_Goods+" set golds="+Current_golds+" goods1=1 where account='"+account+"'";
db.execSQL(sql);
1
this.getActivity()(可以不写this.)在Fragment中直接调用getActivity()方法,可以直接得到Fragment依附的Activity,而Activity是一个Conte...
2.
获取Application对象如下自己写一个MyApplication类继承Application,通过getInstance获取一个Application类型的对象,也是Context对象。
不知道你这个问题是否已经解决, 如果还没有解决的话:创建数据库(onCreateView或onCreate中):
private DbManger dbManger;
dbManger = DbManger.getInstance(view.getContext());//fragment
dbManger = DbManger.getInstance(this);//activity
然后通过dbManger调用所需的操作函数即可。