我想做的事应该很简单: 我正在尝试使用Android Studio读取XML文件并将数据写入数据库。
我的代码的简化版本如下:
MainActivity.java:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
XMLReader r = new XMLReader();
r.Reader(getXML());
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//Creates each station
public void newStation(int stationID, String stationName)
{
DBHandler dbHandler = new DBHandler(this, null, null, 1);
Station station = new Station(stationID, stationName);
dbHandler.addStation(station);
}
private String getXML()
{
//code to get xml
return xml;
}
}
XMLReader.java:
public class XMLReader {
public void Reader (String xmlFile) throws XmlPullParserException, IOException
{
String[] stationData = new String[]{"",""};
//code to cut xml file up and put it into stationData
MainActivity.newStation(Integer.parseInt(stationData[0]), stationData[1]);
}
}
(如果你想我也可以为station.java和DBHandler.java添加代码)
现在我遇到的问题是:“非静态方法'newStation(int,java.lang.String)'无法从静态上下文引用”
并且建议告诉我将newStation设为静态,但如果我这样做,那么我就会遇到这个问题:“'... MainActivity.this'无法从静态上下文中引用”
建议告诉我让newStation不是静态的......
据我所知,newStation需要是静态的,以便我将变量传递给它,但是我不能在静态的类中使用上下文'this'。我尝试创建一个上下文,但感觉就像是想把自己挖出一个洞。
我如何解决这个编程悖论?我通常能够在这里找到任何问题的答案,但这是我第一次做不到。如果您知道我错过了解决方案的链接,请在下面发布。非常感谢。
答案 0 :(得分:1)
您正在使用
MainActivity.newStation(...)
如果newStation(...)
方法定义为static
,您只能这样做,例如:
public static void newStation()
您可以以非静态方式访问它:
activity.newStation(...)
其中activity
是对MainActivity
对象的引用。您可以将MainActivity
的引用作为参数传递给XMLReader
构造函数,例如:
public class XMLReader {
MainActivity activity;
public XMLReader(MainAcrivity activity){
this.activity = activity;
}
...
}
和MainActivity.java
:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
XMLReader r = new XMLReader(this);
r.Reader(getXML());
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 1 :(得分:1)
您已拥有MainActivity
类型的对象。这个是调用读取XML的方法。
顺便说一句,请坚持Java Code Conventions并使用小写字母开始方法名称。此外,方法始终做某事,因此它们应该是动词:
public class XMLReader {
public void read (String xmlFile) ...
}
最简单的方法是返回已解析的数据并从newStation
内部调用MainActivity
方法:
public class XMLReader {
public String[] read (String xmlFile) throws XmlPullParserException, IOException {
String[] stationData = new String[]{"",""};
//code to cut xml file up and put it into stationData
return stationData;
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
XMLReader r = new XMLReader();
String[] stationData = r.read(getXML());
newStation(Integer.parseInt(stationData[0]), stationData[1]);
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void newStation(int stationID, String stationName) { ... }
private String getXML() { ... }
}