Java Can';t从第二个类访问数据库帮助程序
我在我的应用程序中创建了CurrentChanceDatabse类。它扩展了SQLiteOpenHelper。我制定了一些评估表格和数据的方法。 当我使用以下代码访问CurrentChanceDatabase类时,它在MainActivity(应用程序启动时启动的默认活动)中运行良好。所有的方法都很有效Java Can';t从第二个类访问数据库帮助程序,java,android,database,Java,Android,Database,我在我的应用程序中创建了CurrentChanceDatabse类。它扩展了SQLiteOpenHelper。我制定了一些评估表格和数据的方法。 当我使用以下代码访问CurrentChanceDatabase类时,它在MainActivity(应用程序启动时启动的默认活动)中运行良好。所有的方法都很有效 public class MainActivity extends AppCompatActivity { CurrentChanceDatabase db; //this line //mo
public class MainActivity extends AppCompatActivity {
CurrentChanceDatabase db; //this line
//more declarations
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = new CurrentChanceDatabase(this); //and this line
//more onCreate functions
}
现在,我想从第二个活动访问同一个数据库。我使用相同的两行代码连接到我的数据库类,但当第二个活动启动时,应用程序崩溃。我在最后解释了我的目标
代码和logcat:
MainActivity.java
package com.example.snehit.probablity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
CurrentChanceDatabase db;
EditText nameOfExperiment;
EditText noOfOutcomes;
Button ContinueBt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = new CurrentChanceDatabase(this);
ContinueBt = (Button) findViewById(R.id.continueButtton);
registerExperimentFunction();
db.deleteAllData(); //see the very end of this question to know about this
force(); //continues to the seconnd class without entring any experiment. will be used for debugging once the app works.
}
public void force(){
Button bt = (Button) findViewById(R.id.force);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent myIntent = new Intent(MainActivity.this, CurrentChanceDatabase.class);
db.close();
startActivity(myIntent);
}
});
}
public void registerExperimentFunction(){
ContinueBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
nameOfExperiment = (EditText) findViewById(R.id.nameOfExperiment);
noOfOutcomes = (EditText) findViewById(R.id.noOfChance);
String nameOfExperimentString = nameOfExperiment.getText().toString();
Integer noOfOutcomesInt = Integer.parseInt(noOfOutcomes.getText().toString());
Boolean success = db.registerExperiment(nameOfExperimentString, noOfOutcomesInt);
if (success)
Toast.makeText(MainActivity.this,"Done Success", Toast.LENGTH_SHORT).show();
else
Toast.makeText(MainActivity.this,"UnDone UnSuccess", Toast.LENGTH_SHORT).show();
Intent myIntent = new Intent(MainActivity.this, CurrentChanceDatabase.class);
db.close();
startActivity(myIntent);
}
});
}
}
AddNames.java
package com.example.snehit.probablity;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.EditText;
import android.widget.LinearLayout;
/**
* Created by Snehit on 6/10/2017.
*/
public class AddNames extends AppCompatActivity {
CurrentChanceDatabase db;
LinearLayout ll;
EditText editText;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_names);
db = new CurrentChanceDatabase(this);
addTextBox();
}
public void addTextBox(){
ll = (LinearLayout) findViewById(R.id.linearLayout1);
Cursor res = db.getAllChance();
//StringBuffer buffer = new StringBuffer();
String chance = res.getString(res.getColumnIndex("CHANCE"));
Integer chanceInt = Integer.parseInt(chance);
//buffer.append(res.getString(0) + "\n");
for(int i=0;i<chanceInt;i++)
{
editText = new EditText(this);
editText.setHint("Name here");
ll.addView(editText);
}
}
}
添加_names.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linearLayout1">
</LinearLayout>
当数据库类从MainActivity类加载时,不会出现此错误
我想做什么
用户从activity_main.xml(MainActivity.java)注册一个实验。当用户点击continue(继续)时,名称和机会数将被放入数据库。除了数据库函数外,还会传递一个启动AddNames.java的意图。此活动从数据库中获取未完成实验*数据库中的机会数,并在add_names.xml中创建相同数量的EditText,以便用户可以命名
*未完成的实验/deleteAllData();-当用户命名了一个实验的所有机会后,它将被标记为已完成,表中的“已完成”值将从0增加到1。这个功能本来是要添加到AddNames.java中的,但是由于它甚至拒绝启动,我还没有把代码放进去。从MainActivity.java添加新实验时,其“完成”值为零。所有其他实验的“完成”值均为1。(这个东西的代码将在开发完成后发布)。因此,为了确保只有“已完成”值为0的on-experiment,我在应用程序启动时删除了所有条目。为了得到未完成的实验,我使用“WHERE COMPLETED=0”查询数据库。
谢谢大家!
编辑:
我的Android清单xml文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.snehit.probablity">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.example.snehit.probablity.AddNames" android:label="@string/app_name">
</activity>
我以前不想再加上这个
再次感谢你
但当第二个活动启动时,应用程序崩溃
这显然意味着第二个活动AddNames
未在项目清单中注册。因此,获取此错误:
android.content.ActivityNotFoundException:找不到显式活动类{com.example.sneit.probably/com.example.sneit.probably.CurrentChanceDatabase};您是否在AndroidManifest.xml中声明了此活动?
确保在清单中注册AddNames
活动
将此添加到您的
manifest.xml
:
但当第二个活动启动时,应用程序崩溃
这显然意味着第二个活动AddNames
未在项目清单中注册。因此,获取此错误:
android.content.ActivityNotFoundException:找不到显式活动类{com.example.sneit.probably/com.example.sneit.probably.CurrentChanceDatabase};您是否在AndroidManifest.xml中声明了此活动?
确保在清单中注册AddNames
活动
将此添加到您的
manifest.xml
:
在使用ide中的调试工具后,我自己发现了错误。错误出现在MainActivity.java中,我在其中为continue按钮设置了button onClick函数
意图的代码应该是
Intent myIntent=newintent(MainActivity.this、AddNames.class)代码>
我的初始代码在单击时启动CurrentChanceDatabase.java,我不想这样做
另外,在addTextBox()函数的AddNames.java类中获取未完成实验的机会数的代码是错误的。必须使用while循环以res.moveToNext()
作为条件检索机会数。在循环中,必须检索机会数并将其转换为整数,以便在添加文本框的循环中使用。在使用ide中的调试工具后,我自己发现了错误。错误出现在MainActivity.java中,我在其中为continue按钮设置了button onClick函数
意图的代码应该是
Intent myIntent=newintent(MainActivity.this、AddNames.class)代码>
我的初始代码在单击时启动CurrentChanceDatabase.java,我不想这样做
另外,在addTextBox()函数的AddNames.java类中获取未完成实验的机会数的代码是错误的。必须使用while循环以res.moveToNext()
作为条件检索机会数。在循环中,必须检索机会数并将其转换为整数,以便在添加文本框的循环中使用。我已经在清单文件中声明了活动。我忘了把舱单的密码寄出去了。请参见已编辑的问题。另外,错误要求声明CurrentChanceActivity.java(而不是像您要求的那样声明AddNames.java)。在声明当前chance.java时,我收到一个关于“未找到匹配构造函数”的错误。我已经在清单文件中声明了该活动。我忘了把舱单的密码寄出去了。请参见已编辑的问题。另外,错误要求声明CurrentChanceActivity.java(而不是像您要求的那样声明AddNames.java)。在声明Current chance.java时,我得到一个关于“未找到匹配构造函数”的错误。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.snehit.probablity.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Name"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/nameOfExperiment"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="No. of outcomes"
android:id="@+id/textView2"
android:layout_below="@+id/nameOfExperiment"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/noOfChance"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true"
android:inputType="number" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Continue"
android:id="@+id/continueButtton"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Force continue"
android:id="@+id/force"
android:layout_below="@+id/continueButtton"
android:layout_alignStart="@+id/textView2" />
799/com.example.snehit.probablity E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.snehit.probablity, PID: 1799
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.snehit.probablity/com.example.snehit.probablity.CurrentChanceDatabase}; have you declared this activity in your AndroidManifest.xml?
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1805)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
at android.app.Activity.startActivityForResult(Activity.java:4225)
at android.app.Activity.startActivityForResult(Activity.java:4183)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:784)
at android.app.Activity.startActivity(Activity.java:4522)
at android.app.Activity.startActivity(Activity.java:4490)
at com.example.snehit.probablity.MainActivity$2.onClick(MainActivity.java:56)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
06-10 21:43:46.216 795-807/system_process W/ActivityManager: Force finishing activity com.example.snehit.probablity/.MainActivity
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.snehit.probablity">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.example.snehit.probablity.AddNames" android:label="@string/app_name">
</activity>